为什么这个简单的测试失败?
var dict1 = new Dictionary<int, int> {{1, 15}};
var dict2 = new Dictionary<int, int> {{1, 15}};
var equals = EqualityComparer<IDictionary<int, int>>.Default.Equals(dict1, dict2);
Assert.IsTrue(equals);
...非常感谢。我结束了自己的字典...这看起来像是人们应该做的吗?
public class EquatableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IEquatable<EquatableDictionary<TKey, TValue>>
{
public EquatableDictionary() { }
protected EquatableDictionary(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
public bool Equals(EquatableDictionary<TKey, TValue> other)
{
if (other == null)
return false;
foreach (var kvp in this)
{
if (!other.TryGetValue(kvp.Key, out var otherValue))
return false;
if (!Equals(kvp.Value, otherValue))
return false;
}
return true;
}
}
答案 0 :(得分:4)
如documentation中所述:
Default属性检查类型
T
是否实现了System.IEquatable<T>
接口,如果是,则返回使用该实现的EqualityComparer<T>
。否则,它将返回一个EqualityComparer<T>
,它使用Object.Equals
提供的Object.GetHashCode
和T
的替代。
由于IDictionary<TKey,TValue>
未实现System.IEquatable<IDictionary<TKey,TValue>>
,因此将返回一个相等比较器,该比较器使用Object.Equals
提供的Object.GetHashCode
和T
的替代。由于在您的情况下不会覆盖这两种方法,因此将返回默认实现,即使两个键的所有键都相同且所有对应的值都相同,结果还是会有两个字典,包含它们的字典不相等。