У меня есть структура данных вроде
public DespatchGroup(DateTime despatchDate, List<Products> products);
И я пытаюсь сделать ...
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);
}
Я, очевидно, не понимаю, IGrouping
поскольку не вижу, как на самом деле добраться до записей данных в группе!
c#
linq
data-structures
igrouping
боязнь
источник
источник
Ответы:
Орудия группы
IEnumerable<T>
- В общем случае, просто позвонитеforeach
надgroup
. В этом случае, поскольку вам понадобитсяList<T>
:list.Add(new DespatchGroup(group.Key, group.ToList());
источник
value
это сравнимоToList()
только с дополнительными накладными расходами, чтобы преобразовать его в список, а не просто вытащить значениеValues
собственность, как они себе представляли, им бы пришлось ее использоватьgroup.Values.ToList()
. И наоборот, если бы они принимали любое перечислимое вместо списка, тогдаnew DespatchGroup(group.Key, group)
бы они работали. Накладные расходыDespachGroup
связаны с определением, а не с тем, как работает IGrouping.Там нет
Values
собственности или подобной , потому чтоIGrouping<T>
сам по себе являетсяIEnumerable<T>
последовательностью значений. Все, что вам нужно сделать в этом случае, - это преобразовать эту последовательность в список:list.Add(new DespatchGroup(group.Key, group.ToList());
источник
group.AsEnumerable()
.Для любой выбранной группы вы можете позвонить
var selectedGroupValues=selectedGroup.SelectMany(x=>x);
источник
.Select
что снова вернет IGrouping <>,.SelectMany
вернет IEnumerable типа группированных значений, что я и искал .IEnumerable<IGrouping<key,DespatchGroup>>
). В противном случае используйтеtoList()
или просто приведите его кIEnumerable<DespatchGroup>
.Просто связанный совет - поскольку, как говорили другие ответы, группировка является IEnumerable, если вам нужно получить доступ к определенному индексу, вы можете использовать
group.ElementAt(i)
.Вероятно, это очевидно для многих, но, надеюсь, некоторым это поможет!
источник