2013-08-23 102 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