4

インターフェイスListを使用して、C#から個別の項目を取得したい。IEqualityComparerしかし、私は知りませんGetHashCodeGetHashCodeとメソッドの両方を実装しEqualsました。また、メソッドを呼び出しEqualsて、ユーザー定義のデータ型を持つリストから個別のアイテムを取得するにはどうすればよいですか。

4

3 に答える 3

5

Distinctカスタム等値比較子を渡す拡張メソッドを使用できます。

必要な理由GetHashCode()は、それがなければO(n^2)比較が必要だからです。アイテムをGetHashCode()バケットに分割できるO(n)ため、適切なハッシュ実装につながります。

アイテム タイプが独自のものである場合は、を作成する代わりに、タイプ自体でEqualsandをオーバーライドできます。GetHashCodeIEqualityComparer<T>

于 2011-09-30T10:13:16.620 に答える
4

Equals メソッドを呼び出して、ユーザー定義のデータ型を持つリストから個別の項目を取得するにはどうすればよいですか。

オーバーロードをEnumerable.Distinct使用IEqualityComparerして、カスタム等値比較子を使用してシーケンスから個別の項目を取得します。

IEqualityComparer に GetHashCode を実装する理由

をハッシュ テーブル内の等価性IEqualityComparerのテストとして使用できるようにするため (IEqualityComparer.GetHashCode方法に従ってアイテムをハッシュしIEqualityComparer.Equals、必要に応じて等価性をチェックするために使用します (ハッシュ テーブル内のアイテムの検索など)。

于 2011-09-30T10:12:32.293 に答える
0

IEqualityComparer に GetHashCode を実装する理由

少なくとも IEqualityComparer を必要とする LINQ 拡張メソッドでは、通常は Equals の前に IEqualityComparer で呼び出されるためです。そうしないと、等しいかどうかを判断するために GetHashCode を実装する必要があるかどうか疑問に思うでしょう。LINQ が GetHashCode を呼び出すことを好むのはなぜですか? Equals() よりも GetHashCode() を使用する理由を参照してください 。

于 2011-10-09T00:21:39.733 に答える