問題タブ [iequatable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - IEquatable を理解する
IEquatable<T>
インターフェイスを使用して比較したいオブジェクトを実装する場合:
Equals(object)
既に実装している場合、メソッドをオーバーライドする必要があるのはなぜEquals(T)
ですか?==
実装したらand!=
演算子を使用できますIEquatable<T>
か?
c# - アイテムのプロパティを比較して List.Contains を自動的に処理することは可能ですか?
List.Contains(myItem)
リスト内のアイテムのプロパティが のプロパティと等しいかどうかを確認するために、同様のことを行うことができますかmyItem
。
(次のようなものを検討Contains
しました。Exists
単純な表現は得られません。)
次のような単純なものが必要です。
少なくとも 1 つの項目が満たされる場合、このメソッドは自動的に true を返す必要がありますorderLines[i]
。
IEquatable<OrderLine>
プロパティによって等しいものを実装しましProduct
たが、そこから先に進む方法が見つかりません。
c# - 参照型の場合、IEquatable を使用する方法鋳造の使用を減らしますか。
私はいくつかの記事で読んだことがあります
IEquatable を使用した参照型の場合、キャストの使用を減らす
誰かが説得力のある例を親切に提供できますか。
c# - 文字列フィールドの連結をハッシュ コードとして使用する必要がありますか?
次のような C# の Address クラスがあります。
私は平等を実装しているので、ハッシュコードをオーバーライドする必要があります。最初は EJ のハッシュコード式を使用するつもりでしたが、次のように考えました: これらはすべて文字列フィールドです。StringBuilder を使用してそれらを連結し、その文字列からハッシュ コードを返すことはできないのでしょうか?
あれは:
これの利点/欠点は何ですか? なぜ私はそれをすべきではないのですか?
c# - Equals メソッド実装ヘルパー (C#)
データ クラスを作成するたびに、IEquatable の実装に多くの時間を費やします。
私が書いた最後のクラスは次のようなものでした:
IEquatable の実装は非常に困難でした。確かに C#3.0/LINQ は大いに役立ちますが、頂点をシフトしたり、逆の順序にしたりできるため、Equals メソッドが非常に複雑になります。多くの単体テストと対応する実装の後、あきらめて、アプリケーションを三角形のみを受け入れるように変更しました。IEquatable の実装では、11 個の単体テストのみを完全にカバーする必要がありました。
Equals と GetHashCode の実装に役立つツールまたは手法はありますか?
c# - IEquatableインターフェイスnullをチェックするときに何をするか
次のコードを使用して、IEquatableインターフェイスをクラスに実装しました。
このコードは、ほとんどすべての場合に非常にうまく機能します。ただし、次のチェックでは、aがnullであり、Equalsメソッドがないため、等式演算子のオーバーロードメソッドで例外がスローされます。
この問題を解決するための標準的な方法は何ですか?
編集
私はこれに行きましたが、それはかなり面倒なようです。これを達成するためのよりエレガントな方法があることを望んでいました。
解決
皆さんありがとう。みんなからたくさんの良いアドバイスをもらいました。本当に感謝しています。これは私が最終的に決めたものであり、私が始めたものよりもはるかにエレガントです。演算子のオーバーロードを除いて、すべてのコードは同じです。
c# - 複雑な等価性のために Object.GetHashCode() を実装するにはどうすればよいですか?
基本的に、私はこれまでのところ以下を持っています:
したがって、問題は次のとおりですGuid
。一意の識別子である必須ではないフィールドがあります。これが設定されていない場合は、2 つのオブジェクトが等しいかどうかを判断する試みとして、精度の低いメトリックに基づいて等しいかどうかを判断する必要があります。これはうまくいきますが、GetHashCode()
面倒になります...どうすればいいですか?単純な実装は次のようになります。
しかし、2 種類のハッシュが衝突する可能性はどのくらいでしょうか? 確かに、そうなるとは思いません1 in 2 ** 32
。これは悪い考えですか? もしそうなら、どうすればいいですか?
.net - スペースが 32 ビットより大きい場合、GetHashCode 互換の Equals メソッドを実装する方法は?
.NET では、Equals(object) と GetHashCode() に互換性がある必要があります。ただし、次のことができない場合があります。
データ密度が 32 ビットを超え、GetHashCode が Int32 を返すため、次の 3 つの解決策があります (GetHashCode が正しく実装されていると仮定します)。
/li>正しくないとして破棄されるコードの重複を避けるGetHashCode() とは別に Equals を実装する
/li>より高い精度の GetHashCode64 を実装すると、オーバーライドされた GetHashCode (32 ビット) は (int)GetHashCode64() を返し、Equals は this.GetHashCode64() == other.GetHashCode64() を返します。
どれを実装しますか?
最初の解決策は不正確ですが、よりクリーンです。2 番目のオプションはきれいに見えますが、クラスのプロパティが増えると非常に複雑になります。3 番目のオプションは妥協です。
c# - 等価比較でヌルを扱う方法は?
等値比較子を実装する必要がある場合
作ろうかな
と
と
間違い?
そして何について
それも偽であるべきですか?
更新人々は、この質問の背後にある理由を疑問視しています。!= と == は常に反対であると想定されています。しかし、上記のすべての比較が false になるようにメソッドを実装すると、== 演算子と != 演算子が同じ結果になる場合があります。したがって、!= が true を返すか false を返すかはジレンマです。