如何检查两个词典是否包含相同的值?

时间:2013-06-05 15:54:25

标签: c# linq dictionary equality

我有这个,但它太短了我几乎可以肯定我错过了一些东西:

public static bool ValueEquals<TKey, TValue>
    (this IDictionary<TKey, TValue> source, IDictionary<TKey, TValue> toCheck)
{
    if (object.ReferenceEquals(source, toCheck))
        return true;
    if (source == null || toCheck == null || source.Count != toCheck.Count)
        return false;
    return source.OrderBy(t => t.Key).SequenceEqual(toCheck.OrderBy(t => t.Key));
}

所以基本上,如果他们有相同的引用,则返回true。如果其中任何一个为null或其计数不同,请返回false。然后返回序列(按键和它们的值排序)是否相同。我必须错过一些东西,因为它太短而不够好。

1 个答案:

答案 0 :(得分:4)

是的,只要密钥全部实现IComparable,密钥和值都有一个Equals方法来比较您想要比较的内容,您的代码就可以运行。如果键或值没有适当的那些方法实现,那么这将不起作用。

您的方法也不提供要传递的自定义IComparerIEqualityComparer对象的功能,以便考虑对象没有其中一种方法的理想实现的情况。在您的特定情况下,这是否是一个问题,我们不能说。

你的解决方案还需要对所有值进行排序,这比设置等于其他可能的实现效率稍差,但它不会显着更糟,所以如果你没有特别大的话收藏不应该是一个大问题。

一种功能与您的功能相当但速度提高的方法(保留前两次检查):

return !source.Except(toCheck).Any();

由于此方法不依赖于排序,因此它还提供了不需要TKey来实现IComparable的好处。

此方法和方法都有效的一个关键原因是KeyValuePair覆盖了EqualsGetHashCode的定义,以基于它自己的引用,但是而是它所包含的关键和价值。如果键和值都相等,则两个KeyValuePairs相等,并且哈希码包含键和值的哈希码。