我有这个,但它太短了我几乎可以肯定我错过了一些东西:
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
。然后返回序列(按键和它们的值排序)是否相同。我必须错过一些东西,因为它太短而不够好。
答案 0 :(得分:4)
是的,只要密钥全部实现IComparable
,密钥和值都有一个Equals
方法来比较您想要比较的内容,您的代码就可以运行。如果键或值没有适当的那些方法实现,那么这将不起作用。
您的方法也不提供要传递的自定义IComparer
或IEqualityComparer
对象的功能,以便考虑对象没有其中一种方法的理想实现的情况。在您的特定情况下,这是否是一个问题,我们不能说。
你的解决方案还需要对所有值进行排序,这比设置等于其他可能的实现效率稍差,但它不会显着更糟,所以如果你没有特别大的话收藏不应该是一个大问题。
一种功能与您的功能相当但速度提高的方法(保留前两次检查):
return !source.Except(toCheck).Any();
由于此方法不依赖于排序,因此它还提供了不需要TKey
来实现IComparable
的好处。
此方法和方法都有效的一个关键原因是KeyValuePair
覆盖了Equals
和GetHashCode
的定义,以基于它自己的引用,但是而是它所包含的关键和价值。如果键和值都相等,则两个KeyValuePairs
相等,并且哈希码包含键和值的哈希码。