Tha*_*abo 22 c# algorithm collections dictionary data-structures
我有两个Generic Dictionaries.Both有相同的键.但是值可以不同.我想比较第二个字典和第一个字典.如果值之间存在差异,我想将这些值存储在单独的字典中.
1st Dictionary
------------
key       Value
Barcode   1234566666
Price     20.00
2nd Dictionary
--------------
key       Value
Barcode   1234566666
Price     40.00
3rd Dictionary
--------------
key       Value
Price     40
可以任何人给我一个最好的算法来做这个.我写了一个算法,但它有很多循环.我正在寻求一个简短而有效的想法.也像使用LINQ查询表达式或LINQ lamda表达式的解决方案.我正在使用.带有C#的Net Framework 3.5.我发现了一些关于Except()方法的东西.但不幸的是我无法理解该方法发生了什么.如果有人解释建议的算法,那就太好了.我总是喜欢学习:).
谢谢塔博.
Jon*_*eet 34
如果您已经检查过密钥是否相同,您可以使用:
var dict3 = dict2.Where(entry => dict1[entry.Key] != entry.Value)
                 .ToDictionary(entry => entry.Key, entry => entry.Value);
为了解释,这将:
dict2dict1并过滤掉两个值相同的任何条目dict1值不同的条目)中形成字典,方法是从每个条目中获取键和值,就像它们出现一样dict2.请注意,这可以避免依赖于相等KeyValuePair<TKey, TValue>- 依靠它可能是可以的,但我个人觉得这更清楚.(当您为字典键使用自定义相等比较器时,它也会起作用 - 尽管您也需要将其传递给它ToDictionary.)
Roy*_*mir 26
尝试:
dictionary1.OrderBy(kvp => kvp.Key)
           .SequenceEqual(dictionary2.OrderBy(kvp => kvp.Key))
Cha*_*mal 13
检查任何差异,
dic1.Count == dic2.Count && !dic1.Except(dic2).Any();
以下代码返回所有不同的值
dic1.Except(dic2) 
car*_*ira 11
你提到两个词典都有相同的键,所以如果这个假设是正确的,你不需要任何花哨的东西:
        foreach (var key in d1.Keys)
        {
            if (!d1[key].Equals(d2[key]))
            {
                d3.Add(key, d2[key]);
            }
        }
或者我误解了你的问题?
假设两个字典具有相同的键,最简单的方法是
var result = a.Except(b).ToDictionary(x => x.Key, x => x.Value);
编辑
请注意,a.Except(b)给出的结果与 不同b.Except(a):
a.Except(b): Price     20
b.Except(a): Price     40