2013-10-22 2 views
8

사전의 키와 값을 반대로하고 싶습니다. 저는 소스 사전 Dictionary<int, string>에서 Dictionary<string, List<int>>을 얻고 싶습니다. 값이 다른 키 아래에서 여러 번 소스 사전에있을 수 있기 때문에 List<int>이 있습니다.사전에 키와 값을 역순으로 정렬하십시오.

예 : 도움을

{ 
    "A": [1,2,3] 
    "B": [4,5] 
    "C": [6] 
    "D": [7] 
} 

감사 :

{ 
    1: "A" 
    2: "A" 
    3: "A" 
    4: "B" 
    5: "B" 
    6: "C" 
    7: "D" 
} 

가 변환됩니다.

편집 :

OK, 나는이 알고리즘에 대해 조금 이해할 수 있었다 너희들의 도움으로. 이제 두 가지 가능한 솔루션을보고 (그 중에서도) 결과가 동일 해 보이는 것처럼 실제 차이점을 모릅니다.

성능 문제가 있습니까?

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key) 
    .ToDictionary(group => group.Key, group => group.AsEnumerable()); 
var byGroupBy = actions.GroupBy(pair => pair.Value, pair => pair.Key) 
    .ToDictionary(group => group.Key, group => group.AsEnumerable()); 

편집 2 :

내가이는이 간단한 것 기대하지 않았다 단지

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key) 

사용하여 끝났다. 감사합니다.

var res = dict 
    .GroupBy(p => p.Value) 
    .ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList()); 

먼저 그룹 값에 의하여 :

+1

당신이를 만들려고 사전에서 조회 하시겠습니까? 이 경우, ToLookup() 확장 메소드는 친구입니다. – Baldrick

+1

@B ... 그걸 알아 내려고했지만, 모든 매개 변수와 오버로드로 GroupBy 메서드를 사용하지 못했습니다. – sidon

+0

'var byLookup = actions.ToLookup (pair => pair.Value, pair => pair.Key)'만으로도 충분합니다. ToDictionary를 호출 할 필요는 없습니다. –

답변

23

이것은 매우 간단한 LINQ의 표현이다. 이것은 문자열을 키로하는 그룹을 만들고 KeyValuePair<int,string>을 항목으로 만듭니다.

그런 다음 그룹의 키를 사전 키로 사용하고 원래 사전의 키를 ToList()의 목록으로 "병합"하여 그룹을 사전으로 변환합니다.

+0

도움을 주셔서 감사합니다. 내 질문을 업데이트했습니다. 제발 좀 봐 주시겠습니까? – sidon

+0

@sidon 마지막으로 어쨌든 사전을 얻을 수 있기 때문에 보여주는 두 가지 방법은 거의 동일합니다. 그러나 사전에리스트를 두 번 이상 열거하지 않는다는 것을 확실히 알지 못한다면 AsEnumerable()을 거기에 두어서는 안됩니다. – dasblinkenlight

+0

@sidon 사전 개체 대신 조회 개체를 사용할 수 있다면 'ToDictionary'를 건너 뛸 수 있습니다. – dasblinkenlight

3

다음과 같이 당신은 또한 당신의 필요한 결과를 얻을 수 있습니다 :이 dasblinkenlight과 같은 결과를 제공하지만, GROUP BY 절에 KeyValuePair의 매핑을 이동

var result = source 
    .GroupBy(x => x.Value, x => x.Key) 
    .ToDictionary(g => g.Key, g => g.ToList()); 

관련 문제