2012-12-11 8 views
0
List<Foo> fooList = new List<Foo>(); 

fooList.Add(new Foo(){ 
    Id = 1, 
    Bar = 1, 
    Blah = 1 
}); 

fooList.Add(new Foo(){ 
    Id = 1, 
    Bar = 2, 
    Blah = 1 
}); 

fooList.Add(new Foo(){ 
    Id = 2, 
    Bar = 1, 
    Blah = 2 
}); 

만약 I 그룹 내 fooListId 속성으로, Bar를 제외한 모든 특성이 각 그룹에 대해 서로 동일하다. GroupMy 람다 메서드가 있음을 알았지 만 목록을 Id으로 그룹화하고 각 ID에 대해 Bar 속성의 목록을 모두 Bar으로 만들 수 있습니까?병합 그룹화 일반적인 목록

지금 당장 나는 각 행에 많은 중복 데이터가 있기 때문에. 문제를 자세히 설명해주기를 바랍니다.

+0

검색어는 클래스의 구조를 변경할 수 없으므로 '막대'는 'int'이므로 검색어로 'IEnumerable '으로 어떻게 변경해야합니까? (_ "ID로 목록을 그룹화 할 수있는 방법이 있습니까? ** Bar 속성을 모든 바의 목록으로 만듭니다 **"_) –

+0

@TimSchmelter 형식을 '동적'으로 변경하는 것이 도움이 될까요? – Johan

+0

다음과 같이 할 수 있습니다 :'fooList.ToLookup (x => x.Id, x => x.Bar)' – Magnus

답변

2

당신이 요소 선택기를 결정 할 수있는 GroupBy 확장 사용

var query = fooList.GroupBy(f => f.Id, f => f.Bar); 

// Iterate over each grouping in the collection. 
foreach (var group in query) 
{ 
    // Print the key value. 
    Console.WriteLine(group.Key); 
    // Iterate over each value in the 
    // grouping and print the value. 
    foreach (int bar in group) 
     Console.WriteLine(" {0}", bar); 
} 

을 또는 당신은 명시 적 특성으로 Bar을 원하는 경우 : 열심히 조금 읽을 것을 발견했지만

var query = fooList.GroupBy(
    f => f.Id, 
    (id, foos) => new {Id = id, Bars = foos.Select(f=>f.Bar)}); 

.

+0

흠, 나는'Bar' 값을 원하는대로 정렬하고 있습니다. 그러나 각 행의 나머지 속성은 어떻게됩니까? – Johan

+0

@ Johan 그게 정상적인'GroupBy' (요소 선택기없이) 당신을 줄 것입니다. – Magnus

+0

이것은 아마도 내가 내가 다소 불쌍한 설명과 함께 얻을 수있는만큼 가깝습니다 :) 감사합니다. – Johan