我可以重写Dictionary的Equals方法吗?

问题描述 投票:0回答:2

我想用

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”方法。

有什么方法可以做到这一点,还是我坚持使用我目前拥有的东西(也许我至少可以使用模板使其更通用一些)?

c# dictionary overriding equality
2个回答
3
投票

要对

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
}

1
投票

为什么不简单地让你的

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);
© www.soinside.com 2019 - 2024. All rights reserved.