0

私はいくつかのクラスを持つ単純なアプリケーションに取り組んでいます。Removeこれはすべて、 でメソッドを使用したいと思ったときに始まりましたList<Car>。このメソッドでは、タイプのEqualsおよびGetHashCodeメソッドをオーバーライドする必要があります。Carこの状況で、Carクラスに ID プロパティを実装することにしました。そうすれば、私のEqualsメソッドは単に ID が等しいかどうかをチェックし、私のGetHashCodeメソッドは を返しますbase.GetHashCode()

これは良いアプローチですか、それとも小さなクラスに GUID を実装するのは面倒ですか? 上で説明した理由がなければ、それは必要ありません。この Car タイプの一意性に対する唯一の要件は、それがList<T>属するコレクション内で一意であることです。しかし、GUID プロパティを追加することが、GetHashCode混乱を回避する最も簡単な方法のように思えました。ところで、私の Car タイプには int プロパティはありません。

4

2 に答える 2

3

上で説明した理由がなければ、それは必要ありません。

クラスが論理的に ID を持っていない場合、平等のためだけに ID を含めるのは確かに奇妙に思えます。

たとえば、ID 以外のすべてのプロパティが等しい 2 つのインスタンスがある場合、それらは本当に等しくないのでしょうか? そうである場合は、等価性のために参照 ID を使用するEquals/のデフォルトの実装をそのまま使用する必要があります。GetHashCode同じ ID を持つ 2 つのオブジェクトを使用する場合は、代わりに同じオブジェクトへの 2 つの参照を使用します。

それは本当にすべてコンテキストに依存し、あなたはその多くを与えていません - しかし、平等のためだけに ID を追加することは、ちょっとしたデザイン臭です。

于 2012-05-28T15:54:30.903 に答える
1

Equals と GetHashCode を実装する代わりに、次を使用しますRemoveAll

myList.RemoveAll(x => x.ID == myCar.ID);

これにより、代わりにどの項目を削除する必要があるかを示す述語を指定できます (1 つの項目のみを削除することは問題ではありません)。


あなたが説明した方法で実装するEqualsGetHashCode、私は非常に厄介だと思います.Equals実装が返されtrueた場合、GetHashCodeメソッドは同じ値を返す必要があり、これらの2つのオブジェクトがハッシュテーブルの同じバケットに配置されます. 基本実装は、同じ ID を持っているかどうかに関係なく、GetHashCode2 つのインスタンスに対してほぼ確実に異なる値を返すため、実装 (私が理解しているように) はこの基準に一致しません。Car

実装は完全に簡単EqualsGetHashCodeはなく、おそらく、代替手段がある場合は一般的に避けたいことです。本当にこれを行いたい場合は、次のリソースをご覧ください。

また、ハッシュ コードはGUIDではありません

于 2012-05-28T16:06:08.693 に答える