Uzyskaj właściwość „Wartość” w IGrouping


141

Mam strukturę danych, taką jak

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

I próbuję zrobić ...

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

Oczywiście nie rozumiem, IGroupingponieważ nie widzę, jak właściwie dostać się do rekordów danych w grupie!


1
Edycja (Rev2) nie była zbyt konstruktywna, ponieważ nie pasuje do żadnej odpowiedzi.
Sunny Patel

Odpowiedzi:


170

Te narzędzia grupowe IEnumerable<T>- W ogólnym przypadku, po prostu zadzwoń foreachnad group. W tym przypadku, ponieważ potrzebujesz List<T>:

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

Więc w zasadzie, jeśli podążamy za istotą pytania, valuejest to porównywalne z tym, ToList()że istnieje więcej narzutów, aby przekonwertować je na listę, a nie tylko wyciągnąć wartość
Coops

2
@CodeBlend jest więcej narzutów, ponieważ chcą listy. Gdyby istniała Valuesnieruchomość, jaką sobie wyobrażali, musieliby to zrobić group.Values.ToList(). I odwrotnie, gdyby zaakceptowali jakąkolwiek wyliczalną zamiast listy, to new DespatchGroup(group.Key, group)zadziałałoby. Narzut wynika z definicji, a DespachGroupnie ze sposobu działania IGrouping.
Jon Hanna

35

Nie ma Valueswłasność lub podobne, ponieważ IGrouping<T>sama jestIEnumerable<T> sekwencja wartości. Wszystko, co musisz zrobić w tym przypadku, to przekonwertować tę sekwencję na listę:

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

6
Jeśli chcemy, możemy również przekonwertować na IEnumerable: group.AsEnumerable() .
Mateen Ulhaq

22

Możesz zadzwonić do dowolnej wybranej grupy

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

2
Dzięki! W przeciwieństwie do tego, .Selectktóry ponownie zwróci IGrouping <>, .SelectManyzwróci IEnumerable typu zgrupowanych wartości, o co mi chodziło.
K0D4

Powiedziałbym, że używaj tego tylko wtedy, gdy jest wybranych (potencjalnie) wiele grup. (aka IEnumerable<IGrouping<key,DespatchGroup>>). W przeciwnym razie użyj toList()lub po prostu przerzuć na IEnumerable<DespatchGroup>.
jabłko jabłko

21

Tylko pokrewna wskazówka - ponieważ, jak powiedziały inne odpowiedzi, grupowanie jest IEnumerable, jeśli potrzebujesz dostępu do określonego indeksu, którego możesz użyć group.ElementAt(i).

Jest to prawdopodobnie oczywiste dla wielu ludzi, ale miejmy nadzieję, że pomoże to niektórym!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.