2013-05-18 3 views
1

에 매핑 firstnames의 목록, 마지막 이름의 정렬 된 목록에 매핑 할, 즉 Dictionary<string,List<string>> 키는 성 속성이며, 목록은 성 속성의 목록입니다. 나는 위의 예에서 목록 <Info>은 사전 <마지막 목록 <First>>

{ "doe" => { "jon", "jane" }, "borne" => { "jason" }, "nomates" => { "billy" } }을 좀하고 싶습니다.

는 Linq에와 내가 이것에 대해 어떻게 갈 것이라고 그렇다면 깔끔하게 이렇게 할 수 있습니까?

+2

예제를 정렬하지 않았지만 원하는대로 정렬했습니다. 사전은 정렬되지 않은 모음입니다. –

+0

은 잘 발견 - 나는 몰랐어 만 – g18c

답변

2

당신은 GroupBy 사용할 수 있으며 ToDictionary를 얻을이 수행 :

첫째, 수업 공개에 당신의 재산을,이 코드를 사용 : 이런 종류의에 대한

Dictionary<string, List<string>> names = list 
    .GroupBy(x => x.Last) 
    .ToDictionary(x => x.Key, x => x.Select(y => y.First).ToList()); 
1

내가 일반적으로 ILookup<,>를 사용하여 선호를 데이터의. 당신이처럼 구성 할 수 있습니다 :

list.ToLookup(e => e.Last, e => e.First); 

를 기술적으로하지만 아닌 Dictionary<string,List<string>> 당신이 질문처럼, 그것은 여전히 ​​당신은 아마하고 싶어했을 일의 대부분을 할 것입니다. 당신이 ILookup 개체를 변경할 수 없습니다

var firstNamesByLastName = list.ToLookup(e => e.Last, e => e.First); 
foreach(var firstName in firstNamesByLastName["bourne"]) 
{ 
    Console.WriteLine(firstName); // outputs "jason" 
} 

참고. 따라서 새 이름을 만든 후에는 추가 할 수 없습니다. 그러나 당신이 LINQ로 그것을 구성하려고한다는 사실은 당신이 거의 그것을 의도하지 않는다고 말해줍니다.

다른 주요 의미 차이

당신이 거기에 존재하지 않는 뭔가를 조회 할 경우 ILookup 빈 집합을 반환하는 것입니다. 다시 말하지만, 일반적으로 이와 같은 경우에 선호하는 행동입니다.

// if this used a dictionary, we'd get an exception. 
foreach(var firstName in firstNamesByLastName["unborne"]) 
{ 
    Console.WriteLine(firstName); // outputs "jason" 
} 
+0

흠을 그룹화 어떤 정렬을 필요가 없습니다. +1 좋은 대안. – gunr2171

+0

유일한주의해야 할 점은 조회가 변경할 수없는 것입니다. –