IGrouping에서 값을 얻는 방법


211

질문 IGroupingSelect()방법 에 대한 질문이 있습니다 .

내가 IEnumerable<IGrouping<int, smth>>이런 식으로 가지고 있다고 가정 해 봅시다 .

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

여기서 listA는 List<smth>.

그리고 이제 IGrouping어떤 방법으로 각각의 값 을 다른 목록에 전달해야합니다 .

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

아무도 그런 맥락 List<smth>에서 값을 얻는 방법을 제안 할 수 있습니까 IGrouping<int, smth>?


ID는 일반적으로 고유해야하는 ID 필드이므로 중복 데이터를 제거하려는 경우 Distinct ()를 대신 시도하면 그룹화가 필요하지 않습니다. list.GroupBy (x => x.SubID) 인 경우 그룹화를 사용하는 것이 이치에 맞지만 그룹화와 foreach (var grp in groups)를 유지하는 것이 좋습니다. {grp.ToList () ; } 그렇게 할 것
MikeT

답변:


277

IGrouping<TKey, TElement>implements 이므로 모든 백을 하나로 묶는 데 IEnumerable<TElement>사용할 수 있습니다 .SelectManyIEnumerablesIEnumerable

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"와 동일하지 않습니까? List <smth> newList = list .OrderBy (x => x.id) .ToList ();
MorgoZ

@ MorgoZ, 문제는 groups평평한 목록으로 돌아가는 것입니다.
Matt Smith

3
@ MorgoZ OrderBy(x => x.id)는 ID별로 오름차순으로 정렬합니다. 이것을 .GroupBy(x => x.id).SelectMany(group => group)ID와 처음부터 순서대로 정렬 하는와 대조하십시오 . 원래 ID의 순서가 [1,3,2,2,2,3,0] 인 경우 그룹화 한 다음 하나의 목록으로 병합하면 ID가 새로운 순서로 정렬됩니다. [1,3,3, 2,2,2,0].
Pi Fisher

2
그것은 나를 위해 작동하지 않습니다 .. 그것은 사용법에 의해 유형을 유추 할 수 없다고 말합니다
Revious

3
type은 사용법으로 유추 할 수 없습니다
Leo Gurdian

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 in groups.SelectMany (sth => sth))'
user1275513
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.