問題タブ [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# - IEqualityComparer の使用に失敗することを除いて、カスタム オブジェクト
オブジェクトコードは次のとおりです。
そして、次の2つのリストがあります。
delItems には常に両方の項目が含まれます。ここで何が欠けていますか?
編集: コードは IEquatable を実装するようになりました
c# - リスト内のアイテムを検索するサンプルオブジェクトインスタンスを提供する
なぜ方法があるのにList<T>.Contains(T)
方法がないのList<T>.Find(T)
ですか?Find
述語をサポートするsのみがサポートされます。List
IDのプロパティ値が入力されたTの既存のインスタンスがある場合(ただし、他のプロパティが欠落している場合)、特にカスタムIEquatable<T>
を実装T
して使用したい場合は、このオブジェクトインスタンスを検索に提供して検索できないのはなぜですか?何がありますか。しかし、それがそうであるように、私たちはできません。私たちの呼び出しでIEquatable
実装で行ったすべてを繰り返す必要があります。Find(predicate)
c# - CLRタイプのObject.Equals(objA、objB)、objA.Equals(objB)、およびobjA == objBの違いは?
CLRタイプが次とは異なる結果を返すかどうか疑問に思っています。
私は、CLRの外部で、誰かがIEqualtable
Equalsを簡単に実装し、==演算子を不適切にオーバーロードする可能性があることを認識しています。私はこれらを不適切に実装している人々には関心がありません。私が懸念しているのは、クラス(String、Int32などを含む)がこれら3つを異なる方法で実装していることです。
また、可能であれば、全体(全体)の比較に使用するものをどれにする必要があります。Object.Equals(objA, objB)
他の2つではなくビューモデル全体を使用するファイルに出くわしたので、これは疑問に思います。
c# - IEquatable の実装可変型で
外部物理測定デバイスを表すクラスがあります。簡易版は次のようになります。
Tag
デバイスを識別するためのユーザー定義の値です。Address
アダプターがデバイスと通信するために使用する値です。の 2 つのインスタンスがDevice
同じAddress
である場合、同じ外部測定デバイスが使用されます。
をオーバーライドして実装することにより、コードでその動作を模倣したいと思います(Contains
およびのようなメソッドを使用するため) :Distinct
Equals
IEquatable<T>
ご覧のとおりTag
、 の実装ではプロパティを無視していますEquals
。
だから、私の質問は:Tag
の実装でプロパティを無視する必要がありEquals
ますか? そうすることで、コードが理解しにくくなりますか? 私がやろうとしていることを行うためのより良い方法はありますか? Tag
プロパティが必要なのは、多くの場合、ユーザーが を知らない、または が(App.config ファイルで処理されている) を持っているAddress
かどうかさえ知らないためです。プロパティがあります)。Device
Address
IDevice
Address
アップデート:
回答ありがとうございます。
したがって、カスタムを使用する必要があると思いますIEqualityComparer
。私の実際のコードがこのように見える場合、どうすればよいかについてのガイダンスはありますか?
でデバイスの種類を確認する必要がありますIEqualityComparer
か?
gethashcode - 値クラスに GetHashCode を実装する
クラス Money があり、この値クラスに GetHashCode を実装する最良の方法は、$1 != €1 を与えることになるかを知りたいです。通貨に対して重み付けされた値 * 値を持つことは機能しません。
c# - IEqualityComparerの違いは何ですかおよびIEquatable?
IEqualityComparer<T>
とを使用する必要があるシナリオを理解したいと思いIEquatable<T>
ます。両方のMSDNドキュメントは非常によく似ています。
c# - IEquatable はカスケードしますか?
IEquatable に関して非常に単純な質問があります。次の基本クラスがあるとします。
Person オブジェクトと同等かどうかを比較したい場合、どうすればよいでしょうか? Person クラスに IEquatable インターフェイスを実装すると、そのクラス内の任意のオブジェクトに自動的にカスケードされますか?それとも、すべてのクラスにインターフェイスを明示的に実装する必要がありますか?
すべてのクラスにインターフェイスを実装する必要がある場合、Person のインスタンスを Person の別のインスタンスと比較するときに注意すべき特定の「落とし穴」はありますか?
vb.net - IEquatable を正しく実装しましたか? GetHashCode を常にオーバーライドする必要がありますか?
ここで提起された質問を見ました: Equals()/GetHashCode() を正しく実装しましたか? しかし、私の c# はそれほど強力ではなく、IEquatable に慣れていないので、可能であれば VB.NET でこれを見たいと思っています。
私のコード例 (クラスは、そこに到達すると最終的に INotifyPropertyChanged を使用します):
ありがとう、
entity-framework-4 - POCO に IEquatable を実装する
EF の DbSet.Add() がかなり遅いことに気付きました。少しグーグルすると、最大180倍のパフォーマンス向上を約束するSOの答えが見つかりました。
https://stackoverflow.com/a/7052504/141172
IEquatable<T>
ただし、回答で提案されているように実装する方法が正確にはわかりません。
MSDN によると、 を実装する場合はIEquatable<T>
、 と もオーバーライドする必要がありEquals()
ますGetHashCode()
。
多くの POCO と同様に、私のオブジェクトはmutableです。データベースにコミットされる前 ( SaveChanges()
)、新しいオブジェクトの ID は 0 です。オブジェクトが保存された後、ID は IEquatable、Equals()、および GetHashCode() を実装するための理想的な基盤として機能します。
変更可能なプロパティをハッシュ コードに含めることは賢明ではありません。MSDN によると、
2 つのオブジェクトを比較して等しい場合、各オブジェクトの GetHashCode メソッドは同じ値を返す必要があります。
IEquatable<T>
プロパティごとの比較 (例: ) として実装し、 this.FirstName == other.FirstName
Equals() と GetHashCode() をオーバーライドする必要はありませんか?
POCO が EntityFramework コンテキストで使用されている場合、Id フィールドに特別な注意を払う必要がありますか?
c# - ジェネリックで NaN をテストする方法 (または NaN.Equals(NaN) == true の理由)?
配列で最小値と最大値を見つける必要があります(この配列で可能なNaN値を考慮していません)。
これは でのみ簡単に作業できますdouble
が、これらの FindMin および FindMax 関数はジェネリック型で作業する必要があります。
この方法で一般的なNaNをテストしようとしました。
しかしEquals
、戻っtrue
てきますdouble.NaN
??!!
今のところ、次のような回避策があります。
私の質問は、最初の解決策が機能しなかった理由を理解することです。これはバグですか?
ここで小さなテストコードを見つけることができます