2011-12-15 2 views
132

У меня вопрос о методах IGrouping и Select().Как получить значения из IGrouping

Допустим, у меня есть IEnumerable<IGrouping<int, smth>> таким образом:

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

где список является List<smth>.

И теперь мне нужно передать значения каждого IGrouping в другой список, в некотором роде .:

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

Может кто-нибудь подскажет, как получить значение (List<smth>) из IGrouping<int, smth> в таком контексте?

+0

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

ответ

193

С 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(); 
+2

Разве это не так, как обычный «orderBy»? Список newList = list .OrderBy (x => x.id) .ToList(); – MorgoZ

+0

@MorgoZ, вопрос в том, чтобы взять «группы» и вернуться к плоскому списку. –

+1

@MorgoZ, 'OrderBy (x => x.id)' будет сортировать их по возрастанию по ID. Контрастируйте это с помощью .GroupBy (x => x.id) .SelectMany (group => group) ', который сортирует их по порядку первого появления ID. Если исходные идентификаторы находятся в порядке: [1,3,2,2,2,3,0], то группировка их и затем сглаживание в один список поместит идентификаторы в новый порядок: [1,3, 3,2,2,2,0]. –

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

Прежде всего, необходимо выбрать нужную группу. Затем вы можете использовать метод ToList группы. IGrouping - это значения IEnumerable.

7

Из определения 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 
} 
+0

, который выполняет итерации через группы, а не элементы в группе – MikeT

+0

О, моя ошибка, затем: «foreach (smth p в группах. ВыберитеMany (sth => sth)) ' – user1275513

8

Более выяснены версия выше ответов:

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; 
    } 
} 
Смежные вопросы