2015-04-29 118 views
0

我有幾個字典,我想執行交集。 兩個詞典對於同一個鍵可能有不同的值列表。基於鍵和值的字典交集

實施例:

Dictionary<int, List<int>> Primary = new Dictionary<int, List<int>>(); 
Primary.Add(1, new List<int>()); 
Primary[1].Add(5); 
Primary[1].Add(6); 
Primary[1].Add(7); 

Primary.Add(2, new List<int>()); 
Primary[2].Add(5); 

Dictionary<int, List<int>> Secondary = new Dictionary<int, List<int>>(); 
Secondary.Add(1, new List<int>()); 
Secondary[1].Add(6); 
Secondary[1].Add(7); 
Secondary[1].Add(8); 

Secondary.Add(3, new List<int>()); 
Secondary[3].Add(5); 

因此,我希望得到的字典只包含:

[1],[表< 6,7>]

我怎樣才能做到這一點?實際的數據結構,我想交叉口的形式爲:

Dictionary<long, SortedList<int,List<long>>> 
+0

這是你的哪一部分掙扎?你有什麼嘗試? –

+0

如果在兩個字典中都存在關鍵字,但相應的列表中沒有公共項目,您希望結果是否包含具有空列表的關鍵字? – jmcilhinney

+0

@jmcilhinney是的,如果它們具有相同的鍵但列表中沒有共同的項目,則它應該爲空。 BartoszKP給出的答案完美適用於Dictionary >。我試圖擴展Dictionary >>。它令人困惑 – Sabz

回答

2

你可以做到這一點,如下所示:

var result = Primary.Keys.Intersect(Secondary.Keys) 
       .ToDictionary(key => key, 
           key => Primary[key].Intersect(Secondary[key]).ToList()); 

轉化的結果爲Dictionary<long, SortedList<int,List<long>>>應該很容易。

+0

非常感謝您的回答。它爲數據結構Dictionary >工作。如果你可以幫我解決其他數據結構問題,那真是太棒了 - Dictionary >> - 因爲我對這種方法比較陌生,它會讓我瘋狂! :( – Sabz

+0

@Sabz你可以用完全相同的方式實現它,比方說,你應該創建一個類,而不是構建這樣複雜的嵌套結構,它們不方便,不可讀,因此 - 容易出錯 – BartoszKP

+0

感謝您的評論。我第一次使用linq,所以我發現它令人困惑。另外,我確實考慮過創建類而不是字典,但是很難執行這些交叉點。 – Sabz