9

私は、辞書のキーとしてハッシュ可能なオブジェクトのみを使用できる Python の世界から来ました。C# にも同様の制限はありますか? カスタム型を辞書キーとして使用できますか?

4

3 に答える 3

14

ディクショナリ キーの要件は、比較可能でハッシュ可能であることです。これは .NET のずっと下のタートルであり、すべての型 (ポインター型を除く) は System.Object から派生し、その Equals() メソッドのおかげで常に比較可能です。GetHashCode() メソッドのおかげでハッシュ可能です。したがって、任意の .NET タイプを自動的にキーとして使用できます。

独自のタイプをキーとして使用する場合、オブジェクト ID を再定義する場合にのみ、何か特別なことを行う必要があります。つまり、2 つの異なるオブジェクトを等しくする機能が必要な場合です。次に、通常はオブジェクトのフィールドを比較して、Equals() メソッドをオーバーライドします。そして、GetHashCode() もオーバーライドする必要があります。等しいオブジェクトは同じハッシュ コードを生成する必要があります。

型を変更できない場合、または特に Dictionary の動作をカスタマイズしたい場合は、カスタム IEqualityComparer<> をコンストラクターに渡すことができます。独自の GetHashCode() で生成するハッシュ コードの品質によって、辞書の効率が決まることに注意してください。

于 2013-09-06T08:43:36.670 に答える
2

はい、インターフェース IEqualityComparer を実装し、GetHashCode と Equals をオーバーライドするだけです。

于 2013-09-06T08:21:16.100 に答える