2013-04-18 4 views
1

키와 값이 모두 문자열 인 쌍의 목록 (key, val)이 있습니다. 중복 키로 튜플을 집계하고 싶습니다.그룹화 및 결합 튜플 목록

For (key1, val1), (key2, val2), (key3, val3), (key1, val4), (key2, val5) 

내가 원하는 출력

(key1, val1+val4), (key2, val2+val5) 

이 내 현재 쿼리

var duplicates = Contents.Records.SelectMany(x => x.Users).Select(x => new { Name = x.Name, ID= x.ID}).GroupBy(x => x.ID).Select(x => new { x.Key, Names = x.Select(p=>p.Name).Aggregate((a,b) => a +","+b)}).ToArray(); 

이다 그러나 중복의 각 항목에 대한 마지막에 멤버 이름이 비어 있습니다.

데이터는 다음과 같습니다. 각 레코드에는 List Users가 있습니다. 각 사용자는 이름과 ID를가집니다. 내가 뭘 잘못하고 있니?

+0

나는 당신의 그룹화 및 선택에 명백한 결함이 표시되지 않으며, 실제로 데이터 샘플 세트에 대한 것을 실행하고 나는 생각하는 것을 얻을 수 있습니다 원하는 결과. 입력을 확인하여 예상 한 데이터가로드되었는지 확인 했습니까? 예를 들어, 쿼리를 분할하고'.SelectMany (...), Select (...)'다음에'ToList()'를 수행하십시오. 데이터가 예상대로 표시됩니까? –

답변

1

Aggregate이 작업을 수행해야합니다. 하지만 나는 결코 Aggregate을 좋아하지 않았습니다. 구문은 직관적이지 않습니다 (내 마음 속에). 보통 다른 방법은 더 명쾌 해 보입니다. 가지고이 하나

Tuple<string,string>[] tuples = { 
            Tuple.Create("key1", "val1"), 
            Tuple.Create("key2", "val2"), 
            Tuple.Create("key3", "val3"), 
            Tuple.Create("key1", "val4"), 
            Tuple.Create("key2", "val5") 
           }; 
tuples.GroupBy(t => t.Item1, t => t.Item2) 
     .Select(g => Tuple.Create(g.Key, string.Join("+", g))) 
     .Dump(); // Linqpad output command 

결과 :

key1 val1+val4 
key2 val2+val5 
key3 val3