2

我有两个字典,我希望比较两个字典的键/对值。当我比较它们时,如果第二个字典中的值不同,我想保持它们的配对并将其存储到字典 3 中。

因此,如果我有带 ( ) 的字典 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;
}

对此的任何帮助将不胜感激。我很肯定我可以用字典完成我的目标。在我获得第三本字典后,我将更新表格中的一些信息,然后刷新我正在显示的列表,但这部分要容易得多,然后找出这部分需要哪些方法和算法。任何帮助总是非常非常感谢。谢谢大家。

4

4 回答 4

6
var dict3 = dict2.Except(dict1).ToDictionary(x => x.Key, x => x.Value);
于 2013-08-23T19:50:05.730 回答
2
return dictionary1.Where(kvp => dic2[kvp.Key] != kvp.Value)
    .ToDictionary(kvp => kvp.Key, kvp => dic2[kvp.Key]);

如果字典 1 包含字典 2 中不存在的任何键,这将抛出。不确定这是否是问题的预期业务功能。

于 2013-08-23T19:47:57.387 回答
2

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

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 扩展方法。结果如下:

预期成绩

于 2016-11-15T04:01:46.133 回答
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;
    }
于 2013-08-23T20:01:09.037 回答