2009-02-25 8 views
6

Questa sembra una domanda di base, ma, per la vita di me, non riesco a trovare una soluzione elegante.LINQ to Objects numero di incremento automatico

Fondamentalmente, sto facendo una query LINQ creando un nuovo oggetto dalla query. Nel nuovo oggetto, voglio generare un numero autoincrementato per consentirmi di mantenere un ordine di selezione per un uso successivo (nel mio esempio si chiama Iter).

Qui è la mia soluzione attuale che fa quello che mi serve:

Dim query2 = From x As DictionaryEntry In MasterCalendarInstance _ 
       Order By x.Key _ 
       Select New With {.CalendarId = x.Key, .Iter = 0} 

    For i = 0 To query2.Count - 1 
     query2(i).Iter = i 
    Next 

C'è un modo per fare questo nel contesto della query LINQ (in modo che io non devo ciclo della raccolta dopo il query)?

risposta

29

Pardon me per fare questo in C# non è sicuro esattamente la sintassi in VB.NET:

MasterCalendarInstance 
    .OrderBy(x => x.Key) 
    .Select((x, ixc) => new { CalendarId = x.Key, Iter = ixc }); 
+0

Non vedo come questo risolva il mio problema. in che modo il valore ixc viene popolato e incrementato automaticamente? – Nathan

+3

automagicamente :) è un sovraccarico per il metodo di estensione .Select che accetta Func (vedi http://msdn.microsoft.com/en-us/library/bb534869.aspx) – veggerby

+0

Grazie risolto il mio problema Apprezzo l'aiuto! – Nathan

7

Non so se questo è possibile in VB, ma in C# si usa una chiusura:

+0

Vedi altra risposta: questo/è/possibile ... – Richard

+0

Questa era la mia prima inclinazione (Gerneraly, io sono aC# tizio). Tuttavia, non sono a conoscenza di alcuna versione di vb.net di ++. Sono stato tentato di applicare un metodo delegato per gestirlo, ma questo aggiunge più complicazioni di quelle che preferisco in un compito così semplice. – Nathan

+1

+1 Funziona se si desidera mantenere il codice nella sintassi della query anziché nella sintassi Lambda. – Douglas

0

Mi sono imbattuto in questo post durante il tentativo di risolvere un problema simile con un elenco (di stringa).

Sto postando la mia soluzione alternativa nella speranza che possa essere adottata per risolvere il problema, ma più per chiunque altro incontri questo problema con un elenco (Of T).

Dim list As New List(Of String) 
list.Add("Test1") 
list.Add("Test2") 
list.Add("Test3") 

Dim var = list.Select(Function(s) New With {.Name = s, .RecordID = list.IndexOf(s)}) 

Spero che questo aiuti!

1

Le soluzioni di cui sopra si potrebbe infatti riassumere in VB.NET in questo modo:

MasterCalendarInstance _ 
    .OrderBy(Function (x) x.Key) _ 
    .Select(Function (x, ixc) New With { .CalendarId = x.Key, 
             .Iter = ixc })