2010-07-19 19 views
6

Sto usando 101 LINQ Samples per bagnare i piedi con LINQ. È stata una buona prima risorsa, ma non riesco a vedere un esempio di ciò di cui attualmente ho bisogno.Numero di gruppo in un gruppo LINQ per query

Ho solo bisogno di associare un numero di gruppo sequenziale con ciascun gruppo. Ho una soluzione di lavoro:

var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details }; 


int groupNumber = 0; 
foreach (var group in groups) 
{ 
    // 
    // process each group and it's records ... 
    // 

    groupNumber++; 
} 

Ma, sono sicuro che è possibile utilizzare LINQ per generare anche la groupNumber. Come?

risposta

9

Questo dipende dalle vostre esigenze, ma è possibile utilizzare:

var groupArray = groups.ToArray(); 

Allo stesso modo, è possibile utilizzare ToList. Queste strutture dati sono sequenziali e ogni gruppo ha un indice.


Se avete bisogno l'indice per l'oggetto si crea, un'altra opzione è quella di utilizzare Select:

list.GroupBy(c => c.Name) 
    .Select((details, ind) => 
    new 
    { 
     Name = details.Key, 
     DetailRecords = details, 
     Index = ind 
    }); 
+0

heh, intelligente. Mi piace. –

+0

+1 ... clever =) – Luiscencio

+0

Qui ci sono due risposte. Mi piace la soluzione ToList, ma i due parametri selezionati erano esattamente ciò che stavo cercando. Grazie molto. –

6

questo dovrebbe fare il trucco:

int groupNumber = 0; 
var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details, grpNum = groupNumber++}; 
+0

+1 per associare il GroupNumber al risultato LINQ. –

1

se è solo un numero di gruppo sequenziale, basta usare il metodo Count() sul tuo IEnumerable.

var groups = 
    from c in list 
    group c by c.Name into details 
    select new {Name = details.Key, DetailRecords = details}; 

for(int i = 0; i < groups.Count(); i++) 
{ 
    //Process Records 
} 

Quindi, se avete bisogno il numero gruppo specifico, si può semplicemente prendere i.

+0

Come la mia soluzione originale, ma più pulita in quanto l'incremento non andrà perso nel codice di elaborazione. –