.net - 为什么我们需要 IEqualityComparer,IEqualityComparer<T> 接口(interface)?

标签 .net hashtable iequalitycomparer

'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。
直接实现对象的两种方法和使用 IComparer 接口(interface)有什么区别?

如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?

带有 IEqualityComparer 构造函数的新哈希表有什么不同?

最佳答案

当您需要能够“排序”对象时使用 IComparable 接口(interface),它为您提供了一个方法( CompareTo ),告诉您两个对象是 <、= 还是 >。使用 IEqualityComparer 的构造函数可以让您给出一个特定的 Equals/GetHashCode,它可能与您的对象定义的不同。通常 Hashtable 将使用您的对象覆盖 EqualsGetHashCode (或基础 object EqualsGetHashCode )。

举个例子,标准字符串以区分大小写的方式进行比较( "A" != "a" ),但是您可以创建一个 IEqualityComparer 帮助程序类,以便能够以不区分大小写的方式散列您的字符串。 (从技术上讲,此类已经存在于多个变体中:它们被称为 StringComparer.InvariantCultureIgnoreCaseStringComparer 的所有其他静态方法,它们返回实现 StringComparerIComparerIEqualityComparerIComparer<string>IEqualityComparer<string> 对象)

请注意, Hashtable 使用 IEqualityComparer 可选参数,而不是通用版本 IEqualityComparer<T> ,因为 Hashtable 是前泛型。

关于.net - 为什么我们需要 IEqualityComparer,IEqualityComparer<T> 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7751170/

相关文章:

c# - IEqualityComparer 使用 Except, Intersect

c# - 比较两个列表并忽略特定属性

c# - 如何将派生类型列表分配给 C# 中的基类型列表?

c++ - C++ 中的哈希表与 STL 映射

c# - 服务与程序交互

java - java Set中如何存储唯一的对象以避免重复?

c# - .NET 哈希表克隆

c# - List<T>.Except(List<T>) 未按预期工作

c# - 从 AJAX 结果呈现 HTML 内容

.net - 如何在Delphi中使用.Net程序集而不在GAC或COM中注册它?