myclass というクラスがあるとします。
私のコードには、myclass の 2 つのインスタンス、myclass1 と myclass2 があります。それらについてのすべては、(パブリックおよびプライベート)プロパティが同一であることです。
それらの両方を HashSet に追加しようとすると、両方または 1 つだけが追加されますか? 両方を追加したくない場合は、myclass 定義で equals を上書きできますか? HasSet はそれを使用する方法を知っていますか?
myclass というクラスがあるとします。
私のコードには、myclass の 2 つのインスタンス、myclass1 と myclass2 があります。それらについてのすべては、(パブリックおよびプライベート)プロパティが同一であることです。
それらの両方を HashSet に追加しようとすると、両方または 1 つだけが追加されますか? 両方を追加したくない場合は、myclass 定義で equals を上書きできますか? HasSet はそれを使用する方法を知っていますか?
簡単な答えは、オブジェクトの Equals メソッドに依存します。
より長い答え:
HashSet は IEqualityComparer を使用して、2 つのオブジェクトが等しいかどうかを判断します。提供しない場合はEqualityComparer.Default
、 ;が使用されます。object.Equals(a, b) といくつかのものを効果的に使用して、値の型のボックス化を回避します。
ドキュメントの確認object.Equals(a, b)
: null を確認した後に効果的に実行a.Equals(b)
されます。
のデフォルトの実装でobject.Equals(other)
は、参照の等価性のみをチェックします (つまり、それらはオブジェクトのまったく同じインスタンスです) が、これをオーバーライドして、ID フィールドが同一かどうかのチェックなど、任意のチェックを実行できます。Equals をオーバーライドするときは、GetHashCode もオーバーライドする必要があることに注意してください。
オブジェクトの定義を変更せずに HashSet が等価性を判断する方法を変更したい場合は、代わりにカスタム IEqualityComparer を提供できます。