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, IGrouping
ponieważ nie widzę, jak właściwie dostać się do rekordów danych w grupie!
c#
linq
data-structures
igrouping
strachofawhackplanet
źródło
źródło
Odpowiedzi:
Te narzędzia grupowe
IEnumerable<T>
- W ogólnym przypadku, po prostu zadzwońforeach
nadgroup
. W tym przypadku, ponieważ potrzebujeszList<T>
:źródło
value
jest to porównywalne z tym,ToList()
że istnieje więcej narzutów, aby przekonwertować je na listę, a nie tylko wyciągnąć wartośćValues
nieruchomość, jaką sobie wyobrażali, musieliby to zrobićgroup.Values.ToList()
. I odwrotnie, gdyby zaakceptowali jakąkolwiek wyliczalną zamiast listy, tonew DespatchGroup(group.Key, group)
zadziałałoby. Narzut wynika z definicji, aDespachGroup
nie ze sposobu działania IGrouping.Nie ma
Values
wł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ę:źródło
group.AsEnumerable()
.Możesz zadzwonić do dowolnej wybranej grupy
źródło
.Select
który ponownie zwróci IGrouping <>,.SelectMany
zwróci IEnumerable typu zgrupowanych wartości, o co mi chodziło.IEnumerable<IGrouping<key,DespatchGroup>>
). W przeciwnym razie użyjtoList()
lub po prostu przerzuć naIEnumerable<DespatchGroup>
.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!
źródło