Получите свойство «Value» в IGrouping


143

У меня есть структура данных вроде

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поскольку не вижу, как на самом деле добраться до записей данных в группе!


1
Редактирование (Rev2) было не очень конструктивным, поскольку не соответствует ни одному из ответов.
Санни Патель,

Ответы:


175

Орудия группы IEnumerable<T>- В общем случае, просто позвоните foreachнад group. В этом случае, поскольку вам понадобится List<T>:

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

Таким образом, если мы следуем сути вопроса, то valueэто сравнимо ToList()только с дополнительными накладными расходами, чтобы преобразовать его в список, а не просто вытащить значение
Coops

2
@CodeBlend накладных расходов больше, потому что им нужен список. Если бы была такая Valuesсобственность, как они себе представляли, им бы пришлось ее использовать group.Values.ToList(). И наоборот, если бы они принимали любое перечислимое вместо списка, тогда new DespatchGroup(group.Key, group)бы они работали. Накладные расходы DespachGroupсвязаны с определением, а не с тем, как работает IGrouping.
Джон Ханна,

36

Там нет Valuesсобственности или подобной , потому что IGrouping<T>сам по себе являетсяIEnumerable<T> последовательностью значений. Все, что вам нужно сделать в этом случае, - это преобразовать эту последовательность в список:

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

7
Можно также преобразовать в IEnumerable , если мы хотим: group.AsEnumerable().
Mateen Ulhaq

23

Для любой выбранной группы вы можете позвонить

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

2
Благодарность! В отличие от того, .Selectчто снова вернет IGrouping <>, .SelectManyвернет IEnumerable типа группированных значений, что я и искал .
K0D4 01

Я бы сказал, используйте это только тогда, когда (потенциально) выбрано несколько групп. (он же IEnumerable<IGrouping<key,DespatchGroup>>). В противном случае используйте toList()или просто приведите его к IEnumerable<DespatchGroup>.
яблоко яблоко

21

Просто связанный совет - поскольку, как говорили другие ответы, группировка является IEnumerable, если вам нужно получить доступ к определенному индексу, вы можете использовать group.ElementAt(i) .

Вероятно, это очевидно для многих, но, надеюсь, некоторым это поможет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.