2012-03-15 11 views
33

Ho riscontrato un problema davvero fastidioso. Ho raggruppato una serie di dati e non posso accedere ai dati all'interno del gruppo. Posso arrivare al non bit della chiave dei dati ..Come si esegue l'iterazione di un'interfaccia IGrouping <T>?

Ho un carico di dati che è in forma

Data.Period = x 
Data.Adjustment = y 

eseguo un GroupBy

var groupedData = Data.GroupBy(x => x.Period new {x.Period}); 

Questo riporta (secondo a linq) i miei dati gerarchici che stanno iniziando a guardare come lo voglio. Mi piace iterare attraverso i contenuti, ma non posso ... Come faccio a fare questo? e come faccio a ...

Lavorare come ottenere i Dati. Regolazione senza utilizzare una proiezione. E non voglio ancora progettare perché devo eseguire un altro raggruppamento .... aiuto! :-)

risposta

62

L'interfaccia IGrouping<TKey, TElement> eredita IEnumerable<TElement>:

foreach (var group in groupedData) 
{ 
    var groupKey = group.Key; 
    foreach (var groupedItem in group) 
     DoSomethingWith(groupKey, groupedItem); 
} 

Prendo atto che si sarà meglio usare questo per la tua ricerca, però:

var groupedData = Data.GroupBy(x => x.Period); 

piuttosto che questo:

var groupedData = Data.GroupBy(x => new {x.Period}); 

Se, per esempio, si voleva fare la media delle rettifiche, si potrebbe fare questo:

foreach (var group in groupedData) 
    Console.WriteLine("Period: {0}; average adjustment: {1}", group.Key, group.Average(i => i.Adjustment)); 
+0

Ciao come faccio a eseguire una query sul gruppo nell'istruzione foreach finale nel codice? Come lo lancio in un Igroup? – Exitos

+0

@Exitos non è necessario lanciarlo su un 'IGroup'; già * è * un 'IGroup'. Vedi la risposta modificata per un esempio. – phoog

+0

Quindi, come posso interrogare il gruppo dopo la prima dichiarazione foreach? grazie btw – Exitos

6

Basta usare foreach:

foreach(var group in groupedData) 
{ 
    Console.WriteLine("Period: {0}", group.Key); 
    foreach(var item in group) 
     Console.WriteLine(" Adjustment: {0}", item.Adjustment); 
} 
+0

Grazie mille! :-) – Exitos

10

Ogni elemento di una sequenza di IGrouping<TKey, TElement> è un IEnumerable<TElement> che si può iterare per ottenere i dati che ha un comune TKey:

var groups = Data.GroupBy(x => x.Period); 
foreach(var group in groups) { 
    Console.WriteLine("Period: {0}", group.Key); 
    foreach(var item in group) { 
     Console.WriteLine("Adjustment: {0}", item.Adjustment); 
    } 
} 

Quindi, sopra, groups è un IEnumerable<IGrouping<TPeriod, TAdjustment>> dove TPeriod è il tipo di Period (non ce l'hai detto) e TAdjustment è il tipo di Adjustment. Poi, group è un oggetto che implementa IEnumerable<TAdjustment> (ma ha anche una proprietà Key in modo da poter ottenere la chiave. Infine, item è un TAdjustment, e per ogni group, tutto il item che provengono da iterazione di quella group hanno lo stesso . chiave

+0

Ciao, questo è stato davvero utile grazie – Exitos

6

Anche se forse ovvia per gli altri si può anche usare:

var groups = Data.GroupBy(x => x.Period); 

foreach(var group in groups) 
{ 
    List<Data> dataListByPeriod = group.ToList(); 
    //use this list 
} 
+0

Sì, pensavo di dover fare gruppo (group.Key) .ToList() thx – masteroleary

Problemi correlati