Ottieni proprietà "Value" in IGrouping


141

Ho una struttura di dati come

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

E sto provando a 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);
}

Ovviamente non capisco IGroupingperché non riesco a vedere come raggiungere effettivamente i record di dati all'interno del gruppo!


1
La modifica (Rev2) non era molto costruttiva in quanto non corrisponde a nessuna delle risposte.
Sunny Patel

Risposte:


170

Il gruppo implementa IEnumerable<T>- Nel caso generale , basta chiamare foreachil group. In questo caso, poiché è necessario un List<T>:

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

Quindi, fondamentalmente, se stiamo seguendo l'essenza della domanda valueè paragonabile a ToList()solo lì c'è più di un sovraccarico lì per convertirlo in un elenco invece di tirarne fuori un valore
Coops,

2
@CodeBlend c'è più overhead perché vogliono un elenco. Se esistesse una Valuesproprietà come avevano immaginato, avrebbero dovuto farlo group.Values.ToList(). Al contrario, se accettassero qualsiasi enumerabile anziché un elenco new DespatchGroup(group.Key, group), funzionerebbe. Il sovraccarico deriva dalla definizione di DespachGroupnon dal modo in cui funziona IGrouping.
Jon Hanna,

35

Non ci sono Valuesproprietà o simili perché la IGrouping<T>stessa è la IEnumerable<T>sequenza di valori. Tutto ciò che devi fare in questo caso è convertire quella sequenza in un elenco:

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

6
Possiamo anche convertire in un IEnumerable se vogliamo: group.AsEnumerable().
Mateen Ulhaq,

22

Per qualsiasi gruppo selezionato, è possibile chiamare

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

2
Grazie! A differenza del .Selectquale restituirà di nuovo un IGrouping <>, .SelectManyverrà restituito un IEnumerable del tipo di valori groupped, che è quello che stavo cercando.
K0D4

Direi di usarlo solo quando sono selezionati (potenzialmente) più gruppi. (aka IEnumerable<IGrouping<key,DespatchGroup>>). Altrimenti, usa toList()o semplicemente lancialo su IEnumerable<DespatchGroup>.
mela mela

21

Solo un suggerimento correlato: poiché, come hanno detto le altre risposte, il raggruppamento è un IEnumerable, se è necessario accedere a un indice specifico che è possibile utilizzare group.ElementAt(i).

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.