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!

strachofawhackplanet
źródło
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());
Marc Gravell
źródło
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());
LukeH
źródło
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);
Bassl Kokash
źródło
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!

Rob H.
źródło