Holen Sie sich die Eigenschaft "Value" in IGrouping

141

Ich habe eine Datenstruktur wie

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

Und ich versuche zu tun ...

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);
}

Ich verstehe das offensichtlich nicht, IGroupingda ich nicht sehen kann , wie ich tatsächlich zu den Datensätzen innerhalb der Gruppe komme!

Angst vor einem Hackplaneten
quelle
1
Die Bearbeitung (Rev2) war nicht sehr konstruktiv, da sie keiner der Antworten entspricht.
Sunny Patel

Antworten:

170

Die Gruppe implementiert IEnumerable<T>- Rufen Sie im allgemeinen Fall einfach foreachdie group. In diesem Fall benötigen Sie ein List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList());
Marc Gravell
quelle
Wenn wir also der Essenz der Frage folgen, valueist dies vergleichbar damit, dass ToList()nur ein größerer Aufwand besteht, um sie in eine Liste umzuwandeln,
anstatt
2
@ CodeBlend gibt es mehr Overhead, weil sie eine Liste wollen. Wenn es eine ValuesImmobilie gäbe, wie sie es sich vorgestellt hatten, müssten sie es tun group.Values.ToList(). Umgekehrt new DespatchGroup(group.Key, group)würde es funktionieren, wenn sie eine Aufzählung anstelle einer Liste akzeptieren würden. Der Overhead ergibt sich aus der Definition von DespachGroupnicht aus der Funktionsweise von IGrouping.
Jon Hanna
35

Es gibt keine ValuesEigenschaft oder ähnliches , weil die IGrouping<T>selbst ist die IEnumerable<T>Folge von Werten. In diesem Fall müssen Sie diese Sequenz lediglich in eine Liste konvertieren:

list.Add(new DespatchGroup(group.Key, group.ToList());
LukeH
quelle
6
Wir können auch in eine IEnumerable konvertieren, wenn wir möchten : group.AsEnumerable().
Mateen Ulhaq
22

Für jede ausgewählte Gruppe können Sie anrufen

var selectedGroupValues=selectedGroup.SelectMany(x=>x);
Bassl Kokash
quelle
2
Vielen Dank! Anders als .Selectbei einer erneuten IGrouping <> .SelectManywird eine IEnumerable vom Typ der gruppierten Werte zurückgegeben, nach der ich gesucht habe.
K0D4
Ich würde sagen, verwenden Sie dies nur, wenn (möglicherweise) mehrere Gruppen ausgewählt sind. (aka IEnumerable<IGrouping<key,DespatchGroup>>). Andernfalls verwenden Sie es toList()oder werfen Sie es einfach auf IEnumerable<DespatchGroup>.
Apfel Apfel
21

Nur ein verwandter Tipp - da die Gruppierung, wie die anderen Antworten bereits sagten, eine IE-Zahl ist, wenn Sie auf einen bestimmten Index zugreifen müssen, den Sie verwenden können group.ElementAt(i).

Dies ist wahrscheinlich für viele Menschen offensichtlich, aber hoffentlich hilft es einigen!

Rob H.
quelle