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!


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

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

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

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.