一尘不染

如何在C#中比较两个字典

algorithm

我有两个通用字典。两个都有相同的键。但是值可以不同。我想比较第二个字典和第一个字典。如果值之间有差异,我想将这些值存储在单独的字典中。

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()方法的东西。但是不幸的是我不明白这种方法正在发生什么。如果有人解释建议的算法,那就太好了。


阅读 740

收藏
2020-07-28

共1个答案

一尘不染

如果您已经检查过密钥是否相同,则可以使用:

var dict3 = dict2.Where(entry => dict1[entry.Key] != entry.Value)
                 .ToDictionary(entry => entry.Key, entry => entry.Value);

为了说明,这将:

  • 遍历中的键/值对 dict2
  • 对于每个条目,请在其中查找dict1两个值相同的条目,并过滤掉其中的任何条目
  • dict1通过从每对中获取键和值,就像它们在中出现一样,从其余条目(即,值不同的条目)中形成字典dict2

请注意,这避免了依赖于-的相等性KeyValuePair<TKey, TValue> 可以依靠它,但是我个人觉得更清楚。(当您将自定义的相等比较器用于字典键时,它也将起作用-
尽管您也需要将其传递给ToDictionary。)

2020-07-28