Як отримати значення з IGrouping


211

У мене питання про IGroupingі Select()спосіб.

Скажімо, у мене є IEnumerable<IGrouping<int, smth>>такий спосіб:

var groups = list.GroupBy(x => x.ID);

де listє List<smth>.

А тепер мені потрібно IGroupingякось передати значення кожного іншого списку:

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}

Чи хтось може підказати, як отримати значення ( List<smth>) IGrouping<int, smth>у такому контексті?


Ідентифікатор, як правило, є полем ідентичності, яке повинно бути унікальним, і це зробить групування ним непотрібним, якщо ви просто намагаєтесь видалити дублікати даних, спробуйте Distinct (). якби це було list.GroupBy (x => x.SubID), тоді було б доцільно використовувати групування, але в цьому випадку ви, швидше за все, хочете зберегти групування та передбачити (var grp у групах) {grp.ToList () ; } зробив би це
MikeT

Відповіді:


277

Починаючи з IGrouping<TKey, TElement>реалізацій IEnumerable<TElement>, ви можете використовувати, SelectManyщоб об'єднати всі IEnumerablesспинки в один IEnumerableусе:

List<smth> list = new List<smth>();
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id);
IEnumerable<smth> smths = groups.SelectMany(group => group);
List<smth> newList = smths.ToList();

3
Хіба це не те саме, що звичайний "orderBy"? Список <smth> newList = список .OrderBy (x => x.id) .ToList ();
MorgoZ

@MorgoZ, питання про те, groupsщоб повернути та повернутися до плоского списку.
Метт Сміт

3
@MorgoZ, OrderBy(x => x.id)сортуватиме їх у порядку зростання за ідентифікатором. Порівнюйте це з тим .GroupBy(x => x.id).SelectMany(group => group), що буде сортувати їх за порядком першої появи ID. Якщо вихідні ідентифікатори мають порядок: [1,3,2,2,2,3,0], то згрупування їх і потім вирівнювання в один список додасть ідентифікатори в новому порядку: [1,3,3, 2,2,2,0].
Пі-Фішер

2
Це не працює для мене .. в ньому йдеться про те, що тип не може бути зроблений за допомогою використання
Revious

3
тип не може бути зроблений на основі використання
Лев Гурдян

34
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

Спочатку потрібно вибрати бажану групу. Тоді ви можете використовувати ToListметод в групі. Значення IGroupinga IEnumerableє.


17

Більш уточнена версія вищезазначених відповідей:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA);

foreach (var groupingByClassA in groups)
{
    int propertyIntOfClassA = groupingByClassA.Key;

    //iterating through values
    foreach (var classA in groupingByClassA)
    {
        int key = classA.PropertyIntOfClassA;
    }
}

Я так не думаю, принаймні поки що.
snr

15

З визначення IGrouping:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable

ви можете просто повторити такі елементи:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}

1
що він повторює через групування не предметів у групі
MikeT

1
О, моя помилка, тоді: 'foreach (smth p у
групах. ВиберітьMany
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.