私は、辞書のキーとしてハッシュ可能なオブジェクトのみを使用できる Python の世界から来ました。C# にも同様の制限はありますか? カスタム型を辞書キーとして使用できますか?
3 に答える
ディクショナリ キーの要件は、比較可能でハッシュ可能であることです。これは .NET のずっと下のタートルであり、すべての型 (ポインター型を除く) は System.Object から派生し、その Equals() メソッドのおかげで常に比較可能です。GetHashCode() メソッドのおかげでハッシュ可能です。したがって、任意の .NET タイプを自動的にキーとして使用できます。
独自のタイプをキーとして使用する場合、オブジェクト ID を再定義する場合にのみ、何か特別なことを行う必要があります。つまり、2 つの異なるオブジェクトを等しくする機能が必要な場合です。次に、通常はオブジェクトのフィールドを比較して、Equals() メソッドをオーバーライドします。そして、GetHashCode() もオーバーライドする必要があります。等しいオブジェクトは同じハッシュ コードを生成する必要があります。
型を変更できない場合、または特に Dictionary の動作をカスタマイズしたい場合は、カスタム IEqualityComparer<> をコンストラクターに渡すことができます。独自の GetHashCode() で生成するハッシュ コードの品質によって、辞書の効率が決まることに注意してください。
はい、インターフェース IEqualityComparer を実装し、GetHashCode と Equals をオーバーライドするだけです。