2013-08-23 101 views
0

我有兩個詞典,我希望比較兩個詞典的鍵/對值。當我比較它們時,如果第二個字典中的值不同,我想保留它們的配對並將其存儲到dictionary3中。所以如果我有字典1(<1,T><2,T><3,T>)和2與(<1,T><2,F><3,T>)我想3看起來像(<2,F>)。比較兩個詞典並在另一個詞典中返回差異

我不知道從哪裏開始。我有字典正確地獲取他們的所有數據,但現在我不知道如何設置比較。

private Dictionary<int, bool> CompareDictionaries(Dictionary<int, bool> dic2) 
{ 
    Dictionary<int,bool> dictionary3 = new Dictionary<int,bool>(); 

    foreach (KeyValuePair<int, bool> pair in dictionary1) 
    { 
     // keep KeyValuePair of dic2 
     // dictionary3.add(KeyValuePair of dic 2) 
    } 

    return dictionary3; 
} 

任何幫助,將不勝感激。我非常積極地用詞典完成我的目標。在我得到第三個詞典後,我要更新表格中的一些信息,然後刷新我正在顯示的一個列表,但那一部分要容易得多,然後弄清楚這部分需要哪些方法和算法。任何幫助一如既往非常非常感激。謝謝你們。

回答

6
var dict3 = dict2.Except(dict1).ToDictionary(x => x.Key, x => x.Value); 
+0

我們是否需要'ToDictionary'? –

+0

@KingKing由於OP說他想在字典中得到結果,而不是'IEnumerable ',所以是。 – Servy

+0

@Servy什麼關於這個'私人字典比較字典(字典 dic2)'? 'dict2'是'Dictionary',而'dictionary1'是'KeyValuePair'。 –

2
return dictionary1.Where(kvp => dic2[kvp.Key] != kvp.Value) 
    .ToDictionary(kvp => kvp.Key, kvp => dic2[kvp.Key]); 

這將扔了,如果字典1包含字典2.不知道這將是從問題預期的業務功能不存在任何鍵。

1

這是我嘗試;-)

private Dictionary<int, bool> CompareDictionaries(Dictionary<int, bool> dic1, Dictionary<int, bool> dic2) 
    { 
     Dictionary<int, bool> dic3 ; 

     dic3 = new Dictionary<int, bool>(); 

     foreach (KeyValuePair<int, bool> pair in dic1) 
     { 
      // keep KeyValuePair of dic2 
      if (! ((dic2.ContainsKey(pair.Key)) && (dic2[pair.Key] == pair.Value))) 
      { 
       dic3.Add(pair.Key, pair.Value); 
      } 
     } 
     return dic3; 
    } 
+1

您可以使用'TryGetValue'在單個調用中執行ContainsKey檢查和值查找。 – Servy

+0

@Servy謝謝...無論如何,LINQ解決方案如此乾淨,以至於其他任何答案都看起來很糟糕;-) –

+0

不,這可能對OP沒有用處,但是.net2.0下的用戶肯定需要這樣的解決方案 –

0

我沒有類似的東西,而是因爲我想看看三角洲清楚

var aBeforeDictionary = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"few","less"}, {"curve", "ball"}}; 
var anAfterDictionary = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"fun", "guy"}, {"few","more"}}; 

var myBefores = aBeforeDictionary.Except(anAfterDictionary); 
var myAfters = anAfterDictionary.Except(aBeforeDictionary); 

var affectedKeys = myBefores.Select(aPair => aPair.Key).Union(myAfters.Select(aPair => aPair.Key)); 

string aValue; 
var output = affectedKeys.Select(aKey => new { 
           Key = aKey, 
           Before = aBeforeDictionary.TryGetValue(aKey, out aValue) ? aValue : "", 
           After = anAfterDictionary.TryGetValue(aKey, out aValue) ? aValue : "" 
          }); 

output.Dump(); 

返回匿名類型而不是字典Dump()語法是LinqPad擴展方法。以下是結果:

Expected results