2011-01-26 7 views
88

Ho una struttura di dati comeottenere la proprietà "Value" in IGrouping

public DespatchGroup(DateTime despatchDate, List<Products> products); 

E io sto cercando di fare ...

var list = new List<DespatchGroup>(); 

foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate)) 
{ 
    // group.Values is not correct... how do I write this? 
    list.Add(new DespatchGroup(group.Key, group.Values); 
} 

Sono ovviamente non capire IGrouping che posso' Per vedere come ottenere effettivamente i record di dati all'interno del gruppo!

+1

La modifica [(Rev2)] (http://stackoverflow.com/revisions/4804477/2) non era molto costruttivo in quanto non corrisponde a una qualsiasi delle risposte. –

risposta

112

Il Gruppo attua IEnumerable<T> - Nel genere caso, basta chiamare foreach sopra il group. In questo caso, in quanto è necessario un List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList()); 
+0

Quindi, se stiamo seguendo l'essenza della domanda 'value' è paragonabile a' ToList() 'solo che c'è un overhead per convertirlo in una lista invece di tirare fuori un valore – Coops

+1

@CodeBlend c'è di più in testa perché vogliono una lista. Se esistesse una proprietà 'Values' come immaginavano, allora dovevano fare' group.Values.ToList() '. Al contrario, se accettassero qualsiasi enumerazione anziché una lista, il 'nuovo DespatchGroup (group.Key, group)' funzionerebbe. Il sovraccarico deriva dalla definizione di 'DespachGroup' non dal modo in cui funziona l'operazione di raggruppamento. –

24

Non c'è Values proprietà o simili, perché la stessa IGrouping<T>è la sequenza IEnumerable<T> di valori. Tutto quello che devi fare in questo caso è di convertire quella sequenza a un elenco:

list.Add(new DespatchGroup(group.Key, group.ToList()); 
+2

Possiamo anche convertire in un oggetto IEnumerable se desideriamo: 'group.AsEnumerable()'. –

12

Solo un consiglio correlato - dal momento che, come le altre risposte hanno detto, il raggruppamento è un IEnumerable, se avete bisogno di accedere a una specifica indice è possibile utilizzare group.ElementAt(i).

Questo è probabilmente ovvio per molte persone, ma si spera che possa aiutare alcuni!

1

Per ogni gruppo selezionato, si potrebbe chiamare

var selectedGroupValues=selectedGroup.SelectMany(x=>x); 
Problemi correlati