2010-12-31 3 views
2

나는 C#에 두 개의 사전이 있습니다.Linq : 사전 병합

두 개의 사전 및 그들의 calues는 1,2,3 및 4

D2[1] = new List<string>{"a","b"}; 
D2[2] = new List<string>{"c","d"}; 
D2[3] = new List<string>{"e","f"}; 
D2[4] = new List<string>{"g"}; 
D2[5] = new List<string>{"b","h"}; 
D2[6] = new List<string>{"f","l"}; 
D2[7] = new List<string>{"z"}; 

1,2,3,4,5,6 사전 D1의 열쇠

Dictionary<int,List<string>> D1 = new Dictionary<int,List<string>>(); 
Dictionary<int,List<string>> D2= new Dictionary<int,List<string>>(); 
Dictionary<int,List<string>> D3 new Dictionary<int,List<string>>(); 
D1[1] = new List<string>{"a","b"}; 
D1[2] = new List<string>{"c","d"}; 
D1[3] = new List<string>{"e","f"}; 
D1[4] = new List<string>{"h"}; 

입니다 및도 7은 사전 D2의 키,

그렇다면 출력이 사전 값이 포함되어

D3[1] = {"a","b","h"} D3[2] = {"c","d"} D3[3] = {"e","f","l"} 
,745 1,515,

참고 : [7]

는 IT가 LINQ를 사용하여 병합 가능 내가 D1 [3], D2 [3] 및 D2를 제거하고 이유 1.Thats보다 큰 값으로 입력 사전 제발?

+0

만약 내가 당신의 질문을 핵심적으로 이해했다면 D1 [1]의 집합과 D2 [1]의 집합이 D3 [1]을 얻기 위해 뚜렷하게 합쳐 져야합니다. 주어진 예제에서 D3 [1]은 { "a", b ","h "}가 아닌 {"a ","b "} 집합을 제공해야합니다. 이것이 올바른 경우 알려 주시면 해결책을 드릴 수 있습니다. 또한 질문을 업데이트하여 질문이 다른 사람들에게 혼란스럽지 않게하십시오. – samar

+0

정확한 중복 (변수 이름까지!) : http://stackoverflow.com/questions/3156456/merging-dictonaries-in-c-using-linq 누가이 숙제를 설정하면 StackOverflow에이를 수행하도록 요청하는지 알 수 있습니까? 당신? – AakashM

답변

1

네, 가능하지만 예쁜 것은 아닙니다! 당신이 중복을 얻을 수 있도록

//firstly lets get the keys that are valid (i.e. have more than one element in their list) 
var validD1Elements = D1.Where(d => d.Value.Count > 1); 
var validD2Elements = D2.Where(d => d.Value.Count > 1); 

//merge the valid keys together so we know which ones we want to select 
var mergedKeys = validD1Elements.Select(d => d.Key).Union(validD2Elements.Select(d => d.Key)); 

//perform the merge 
var mergeResult = mergedKeys.Select (key => new 
{ 
    Key = key, 
    //select the values from D1 
    Value = validD1Elements.Where(d => d.Key == key).SelectMany(d => d.Value) 
    //concat the values from D2 
    .Concat(validD2Elements.Where(d => d.Key == key).SelectMany(d => d.Value)) 
}).ToDictionary(e => e.Key, e => e.Value); 

이 병합 CONCAT를 사용, 즉 mergeResult[1]{ "a", "b", "a", "b" } 될 것입니다.

원하지 않는 경우 중복이에서 다음 코드를 변경 :

//concat the values from D2 
.Concat(validD2Elements.Where(d => d.Key == key).SelectMany(d => d.Value)) 

이에 :

//union the values from D2 
.Union(validD2Elements.Where(d => d.Key == key).SelectMany(d => d.Value)) 

mergeResult[1] 다음 { "a", "b" } 될 것입니다.

0

모두 연결 한 다음 키로 그룹화 (ToLookup) 한 다음 그룹화의 모든 값을 결합하여 최종적으로 모두 다시 사전에 둡니다.

관련 문제