'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。
直接实现对象的两种方法和使用 IComparer 接口(interface)有什么区别?
如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?
带有 IEqualityComparer 构造函数的新哈希表有什么不同?
最佳答案
当您需要能够“排序”对象时使用 IComparable
接口(interface),它为您提供了一个方法( CompareTo
),告诉您两个对象是 <、= 还是 >。使用 IEqualityComparer
的构造函数可以让您给出一个特定的 Equals
/GetHashCode
,它可能与您的对象定义的不同。通常 Hashtable
将使用您的对象覆盖 Equals
和 GetHashCode
(或基础 object
Equals
和 GetHashCode
)。
举个例子,标准字符串以区分大小写的方式进行比较( "A"
!= "a"
),但是您可以创建一个 IEqualityComparer
帮助程序类,以便能够以不区分大小写的方式散列您的字符串。 (从技术上讲,此类已经存在于多个变体中:它们被称为 StringComparer.InvariantCultureIgnoreCase
和 StringComparer
的所有其他静态方法,它们返回实现 StringComparer
、 IComparer
、 IEqualityComparer
、 IComparer<string>
的 IEqualityComparer<string>
对象)
请注意, Hashtable
使用 IEqualityComparer
可选参数,而不是通用版本 IEqualityComparer<T>
,因为 Hashtable
是前泛型。
关于.net - 为什么我们需要 IEqualityComparer,IEqualityComparer<T> 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7751170/