Отримайте властивість "Value" в IGrouping


141

У мене така структура даних, як

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) не була дуже конструктивною, оскільки не відповідає жодній з відповідей.
Сонячний Патель

Відповіді:


170

Група реалізує IEnumerable<T>- У загальному випадку просто зателефонуйте foreachдо group. У цьому випадку, оскільки вам потрібно List<T>:

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

Отже, якщо ми дотримуємося суті питання value, порівнянна ToList()лише з тим, що є більше накладних даних, щоб перетворити його в список, а не просто витягнути значення
Купс

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

35

Там немає Valuesвласності або подібної , тому що IGrouping<T>сам по собі єIEnumerable<T> послідовністю значень. Все, що вам потрібно зробити в цьому випадку, це перетворити цю послідовність у список:

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

6
Можна також перетворити в IEnumerable , якщо ми хочемо: group.AsEnumerable().
Mateen Ulhaq

22

Для будь-якої вибраної групи ви можете зателефонувати

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

2
Дякую! На відміну від того, .Selectщо поверне IGrouping <> знову, .SelectManyповерне IEnumerable типу згрупованих значень, який я був після.
K0D4

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

21

Просто відповідна порада - оскільки, як говорили інші відповіді, групування є IEnumerable, якщо вам потрібно отримати доступ до певного індексу, який ви можете використовувати group.ElementAt(i).

Це, мабуть, очевидно для багатьох людей, але, сподіваємось, це допоможе мало кому!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.