インターフェイスList
を使用して、C#から個別の項目を取得したい。IEqualityComparer
しかし、私は知りませんGetHashCode
。GetHashCode
とメソッドの両方を実装しEquals
ました。また、メソッドを呼び出しEquals
て、ユーザー定義のデータ型を持つリストから個別のアイテムを取得するにはどうすればよいですか。
3 に答える
Distinct
カスタム等値比較子を渡す拡張メソッドを使用できます。
必要な理由GetHashCode()
は、それがなければO(n^2)
比較が必要だからです。アイテムをGetHashCode()
バケットに分割できるO(n)
ため、適切なハッシュ実装につながります。
アイテム タイプが独自のものである場合は、を作成する代わりに、タイプ自体でEquals
andをオーバーライドできます。GetHashCode
IEqualityComparer<T>
Equals メソッドを呼び出して、ユーザー定義のデータ型を持つリストから個別の項目を取得するにはどうすればよいですか。
のオーバーロードをEnumerable.Distinct
使用IEqualityComparer
して、カスタム等値比較子を使用してシーケンスから個別の項目を取得します。
IEqualityComparer に GetHashCode を実装する理由
をハッシュ テーブル内の等価性IEqualityComparer
のテストとして使用できるようにするため (IEqualityComparer.GetHashCode
方法に従ってアイテムをハッシュしIEqualityComparer.Equals
、必要に応じて等価性をチェックするために使用します (ハッシュ テーブル内のアイテムの検索など)。
IEqualityComparer に GetHashCode を実装する理由
少なくとも IEqualityComparer を必要とする LINQ 拡張メソッドでは、通常は Equals の前に IEqualityComparer で呼び出されるためです。そうしないと、等しいかどうかを判断するために GetHashCode を実装する必要があるかどうか疑問に思うでしょう。LINQ が GetHashCode を呼び出すことを好むのはなぜですか? Equals() よりも GetHashCode() を使用する理由を参照してください 。