問題タブ [iequalitycomparer]
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.
.net - IEqualityComparerアイテムが等しくない場合、GetHashCodeは同じ値を返しますか?
インターフェイスのGetHashCode
メソッドに関するドキュメントの「実装者への注意事項」セクションには、次のように記載されています。IEqualityComparer<T>
Equals メソッドが 2 つのオブジェクト x と y に対して true を返す場合、x の GetHashCode メソッドによって返される値が y に対して返される値と等しくなければならないことを保証する実装が必要です。
T
2 つの項目が等しい場合に、 の2 つのインスタンスが同じハッシュ コードを返すようにする理由はよく知られています。それらが異なるということは、それらが等しくないことを意味しますが、それらが同じであることは、それらが潜在的に等しいことを意味します。
2 つのインスタンスが等しくない場合 (それらの値がそうであることを示唆している場合でも) 、戻り値の引用符は未定義であると解釈します。
以下を例にとります。null 以外のそれぞれがクラスの属性を表す統計的分類int?
に使用したいシーケンスがあります (列挙値を考えてください)。これらの値が null の場合、トレーニング セットが欠損値に偏ってしまうため、値が等しいと見なされることは望ましくありません。どちらかといえば、この場合、他の null 値と比較して false を返す null 値が必要です。int?
問題は、GetHashCode
メソッドで null が指定された場合、おそらく 0 (または他の数値、おそらく ) を返したいことですInt32.MinValue
。IEqualityComparer<T>
さて、この実装を使用して何かにキーを付けると、ディクショナリ内のキーの存在をチェックするパフォーマンスが最適化されないことがわかりました。
つまり、GetHashCode
が呼び出されたときに他の値と競合することがわかっている値を返すことは有効ですか? への呼び出しEquals
が false を返す場合は? 上記の引用はこの問題では定義されていないため、私はイエスに傾いています。
.net - IEqualityComparer、IEqualityComparerが必要な理由インターフェース?
'Equal'メソッドと'GetHashcode'メソッドはオブジェクトクラスに存在し、このタイプはオブジェクト基本クラスを継承します。オブジェクトの2つのメソッドを直接実装することと、IComparerインターフェイスを使用することの違いは何ですか?
オブジェクトのEqualとGetHashCodeをオーバーライドし、ハッシュテーブルにプッシュすると、オーバーライドのequalメソッドが使用されますか?
IEqualityComparerコンストラクターを使用した新しいハッシュテーブルの違いは何ですか?
c# - ジェネリック Dictionary で既定以外の Comparer を保持するために WCF シリアル化を取得するにはどうすればよいですか?
Visual Studio 2010 で最初から開始し、「WCF サービス アプリケーション」を追加するとします。このメソッドと実装を追加します。
次に、新しい「コンソール アプリケーション」を同じソリューションに追加し、(すべての既定の設定を使用して) サービス プロジェクトにサービス参照を追加し、このコードを に追加しますMain
。
大文字と小文字を区別しない辞書はkey
andKEY
を同じキーと見なし、2 番目の をスローするため、このコードは失敗することが予想されAdd
ます。
残念ながら、すべてがコンパイルされて実行されると、残念な顔:(
になります。これDictionary
は、WCF レイヤーに到達すると、特定の非デフォルトで作成されたことを「忘れ」、Comparer
代わりにstring
デフォルトの等値比較子を取得するためです。
ワイヤを通過するときにのComparer
プロパティが保持されるように変更する簡単な設定はありますか? Dictionary
または、カスタム クラスを作成する必要がありますか?
(カスタム IEqualityComparer を使用した Dictionary の XML シリアル化を見たことがありますが、あまり啓発されませんでした。3 年前のこの codeproject コメントも見ましたが、これは私の質問であり、回答ではありません)
linq - 比較デリゲート (または同様のもの) を受け入れる Distinct() のオーバーロードがないのはなぜですか?
クエリ演算子 Distinct() を使用する場合、クエリ対象のシーケンスの型は、GetHashCode() と Equals() の適切なオーバーロードを提供するか、IEqualityComparer<T> の実装を渡す必要があります。
私の質問: Delegate インスタンス (例: Comparison<T>) を受け入れる Distinct() のオーバーロードがないのはなぜですか? - 存在する場合は、より軽量なラムダ式を渡すことができます (IEqualityComparer<T> の実装よりも軽量です)。- ここで何か不足していますか?
c# - How to get a value from a generic dictionary using a custom comparer for the key?
I have a generic dictionary of objects and want to use a custom comparer to update the value in the dictionary.
myObjects
contains a dictionary of objects and the value is the number of times that object exists. Note that the value may be incremented numerous times using different comparators or removed altogether.
testObject
is my custom object.
customComparer
is a dynamically changing comparer based on the type of testObject. but all comparers are of the type IEqualityComparer<MyObject>
I can use Keys.Contains to determine if the object exists with custom comparer but then i'm not sure how to update the value?
.net - EqualityComparer.Default.Equals()は間違った結果を返しますか?
.NET Frameworkのバグである以外に、これについての説明はありますか?メソッドは、次のEqualityComparer<Uri>.Default.Equals()
URLが等しいと言っています!
と
最初のスペースの最後に「s」が続くスペースに注意してください。
c# - 異なる照会可能なリストを作成する
区別する必要があるオブジェクトのリスト、GroupStudentStatus があります。これを行うために、以下のクラスを作成しました。
関連する 2 つの属性は、GroupStudentStatus.IsLastActionRemoved (DateTime) と GroupStudentStatus.Student.Guid です。
テスト方法がわからないことを除けば、これは正しいと思います。
私はこれをやろうとしていました:
c# - IEqualityComparerに関する質問/リスト。明確()
これは、エンティティを含むリストから個別のアイテムセットが必要だったため、先ほど作成した等式比較ツールです。
- なぜでは
Distinct
なく、比較者が必要なのFunc<T,T,bool>
ですか? - (A)と(B)は最適化以外のものであり、参照の比較が微妙であるために、期待どおりに機能しないシナリオはありますか?
必要に応じて、(C)を次のように置き換えることはできますか
return GetHashCode(x) == GetHashCode(y)
c# - 2 つのカスタム オブジェクトの比較 (IEqualityComparer を使用)
まず、比較したいことを言います: My Custom Object (Item) has List of strings taxids
. あるリスト内のすべての文字列が別の文字列リストに含まれているかどうかを確認したい (taxids
別のオブジェクト (アイテム) の別のリストにもなる)。
だから、これはクラスです:
次に、これらはダミーのカスタム オブジェクトです。
ここでは、カスタムの comparer を使用しますItemComparer
。このコードは次のとおりです。
問題は、変数both
が taxid フィールドに何もないことです。通常、「5」「1」のリストが必要です。
比較するときに hashCode が同じでなければならないことはわかっています。しかしtaxids
、同じになることはありません。別の文字列リストで文字列を探すからです。
誰でもこの問題についてさらに助けてもらえますか?
(また、小さな質問: => のようなすべてのものに対して常に同じハッシュコードを返す場合、"a".GetHashCode()
これは機能するかどうか?
前もって感謝します