簡體   English   中英

為什么IEqualityComparer <T> 有GetHashCode()方法?

[英]Why IEqualityComparer<T> has GetHashCode() method?

System.Collections.Generic命名空間中的IEqualityComparer具有以下方法:

bool Equals(T x, T y);
int GetHashCode(T obj);

由於此接口用於檢查對象的相等性,因此第一種方法Equals是有意義的。 但是為什么我們還需要實現GetHashCode呢? 為什么它首先存在於界面中? 什么時候需要,為什么?

我在命名空間System.Linq使用它與Enumerable.Distinct()方法,我很驚訝地發現即使GetHashCode()Equals()一起被調用。 為什么? Distinct如何運作?

有關Distinct如何工作(或至少是一個簡單的示例實現)的詳細信息,請參閱我的Edulinq博客文章舊版 - 404 )。

簡單地說,對應於適當的相等比較的哈希碼使得創建一組項目更便宜。 這在很多情況下Distinct有用 - 例如DistinctExceptIntersectUnionJoinGroupJoinGroupByToLookup等。

GetHashCode用於HashTablesDictionaries等,以優化搜索。 看看這里: http//msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

因為覆蓋等於()和運算符指南==(C#編程指南)說:

建議任何覆蓋Equals的類也會覆蓋Object.GetHashCode。

這是因為Hashtables等期望兩個相等的對象具有相同的哈希碼。

IEqualityComparer(Of T)的目的是允許使用與默認Object.Equals在語義上不同的比較方法 - 即使Object.Equals認為它們不同,也可能導致兩個對象被認為是相等的。 have equal hash codes, and because things which the EqualityComparer's Equals method considers equal but Object.Equals considers unequal might have different hash codes, it is necessary for the the EqualityComparer to use a different hash-coding method. 因為相等的對象具有相等的哈希碼,並且因為EqualityComparer的Equals方法認為相等而Object.Equals認為不相等的東西可能具有不同的哈希碼,所以EqualityComparer必須使用不同的哈希編碼方法。

IEquatable(Of T)存在一個更有趣的情況。 如果Object.Equals報告它們不相等,那么預計永遠不會將兩個對象報告為相等。 對於任何未密封的類來實現IEquatable(Of T)是危險的; 太糟糕了,沒有通用約束禁止使用未密封的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM