Получите свойство «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) .

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

Роб Х
источник