我想用
return d1.Count == d2.Count && !d1.Except(d2).Any();
覆盖 Dictionary 的 Equals 方法
但我想对所有词典执行此操作,而不仅仅是一次针对特定类型。 目前,我的 ExtensionMethods 类中有一个
public static bool IsEqualTo(this Dictionary<string, byte> d1, Dictionary<string, byte> d2)
方法,但它既不是通用的(与任何 KeyValuePairs 一起使用),也没有实际覆盖默认的“Equals”方法。
有什么方法可以做到这一点,还是我坚持使用我目前拥有的东西(也许我至少可以使用模板使其更通用一些)?
要对
Equality
使用您自己的自定义规则,您可以按照评论中建议的 CodeCaster 实现 IEqualityComparer<T>
:
public sealed class DictionaryComparer<K, V> : IEqualityComparer<IDictionary<K, V>> {
public bool Equals(IDictionary<K, V>? left, IDictionary<K, V>? right) {
if (ReferenceEquals(left, right))
return true;
if (left is null || right is null)
return false;
return left.Count == right.Count && !left.Except(right).Any();
}
public int GetHashCode(IDictionary<K, V> value) =>
value is null ? 0 : value.Count;
}
然后每当你想比较两个字典时:
Dictionary<int, string> dict1 = ...
Dictionary<int, string> dict2 = ...
if (new DictionaryComparer<int, string>().Equals(dict1, dict2)) {
//TODO: relevant code here
}
如果您愿意,您可以实现扩展方法:
public static class DictionaryExtensions {
public static bool EqualsToDictionary<K, V>(this IDictionary<K, V> left,
IDictionary<K, V> right) {
var comparer = new DictionaryComparer<K, V>();
return compare.Equals(left, right);
}
}
然后
Dictionary<int, string> dict1 = ...
Dictionary<int, string> dict2 = ...
if (dict1.EqualsToDictionary(dict2)) {
//TODO: relevant code here
}
为什么不简单地让你的
IsEqualTo
方法变得通用呢?
public static bool IsEqualTo<K, V>(this IDictionary<K, V> d1, IDictionary<K, V> d2)
{
return d1.Count == d2.Count && !d1.Except(d2).Any();
}
通过扩展
IDictionary<TKey,TValue>
而不是 Dictionary<TKey,TValue>
,我们可以将扩展方法应用于其他类型的词典,例如 ConcurrentDictionary<TKey,TValue>
或 SortedDictionary<TKey,TValue>
等等。
请注意,C# 可以推断泛型类型参数:
var d1 = new Dictionary<string, byte>();
var d2 = new Dictionary<string, byte>();
var s1 = new SortedDictionary<int, string>();
var s2 = new SortedDictionary<int, string>();
// Not necessary to specify the generic type parameters.
bool result1 = d1.IsEqualTo(d2);
bool result2 = s1.IsEqualTo(s2);