比较两个词典并返回另一个词典中的差异

时间:2013-08-23 19:43:29

标签: c# data-structures dictionary .net-4.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;
}

对此有任何帮助将不胜感激。我非常肯定我可以用词典来实现我的目标。在我获得第3个字典之后,我将更新表格中的一些信息,然后刷新我正在显示的列表,但这部分更容易,然后找出我需要的这部分方法和算法。任何帮助都一如既往地非常感激。谢谢你们。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

如果字典1包含字典2中不存在的任何密钥,则会抛弃。不确定这是否是问题中的预期业务功能。

答案 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;
    }

答案 3 :(得分:1)

我做了类似的事情,但是返回了一个匿名类型而不是一个字典,因为我想清楚地看到增量

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