問題タブ [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# - IEnumerable.Except() とカスタム比較子
Except() メソッドに問題があります。差を返す代わりに、元のセットを返します。
Account クラスに IEquatable と IEqualityComparer を実装してみました。また、Account 用に別の IEqualityComparer クラスを作成してみました。
Except() メソッドがメインから呼び出されると、カスタムの Equals() メソッドが呼び出されないように見えますが、Count() を試してみると、カスタムの GetHashCode() メソッドが呼び出されました!
私はどこかで些細な間違いを犯したと確信しており、新鮮な目が私を助けてくれることを願っています.
主要:
アカウント:
LambdaComparer:
c# - 完全なIEquatable実装リファレンスはありますか?
ここでのSOに関する私の質問の多くは、IEquatableの実装に関するものです。ナイーブな実装には多くの隠れたバグがあり、それについて私が見つけた記事はかなり不完全であるため、正しく実装することは非常に難しいことがわかりました。私は、以下を含まなければならない決定的な参照を見つけたり、書きたいと思っています。
- IEquatableを正しく実装する方法
- Equalsを正しくオーバーライドする方法
- GetHashCodeを正しくオーバーライドする方法
- ToStringメソッドを正しく実装する方法
- 演算子を正しく実装する方法==
- 演算子を実装する方法!=正しく
そのような完全な参照はすでに存在しますか?
PS:MSDNリファレンスでさえ私には欠陥があるようです
c# - Distinct が LINQ to Objects で動作しない
これは、「LINQ in Action」の例に基づいています。リスト 4.16.
これにより、Jon Skeet が 2 回出力されます。なんで?Author クラスで Equals メソッドをオーバーライドしようとさえしました。それでも Distinct は機能していないようです。私は何が欠けていますか?
編集: == および != 演算子のオーバーロードも追加しました。まだ助けはありません。
vb.net - VB.Net IEquatable、アクセス拒否
プロジェクトには、まだ使用していない単純なインターフェイス定義があります。しかし、プロジェクトをビルドしようとすると、次のエラーが発生します。
アクセスが拒否されました:'System.IEquatable`1[Reactor.IOptions]'。
以下はインターフェースです:
何か案は?
linq - デフォルトのEqualityComparerを使用したLinqGroupByの主な比較
明示的なキータイプを使用して、一部のオブジェクトでLinqGroupByを実行しようとしています。私はIEqualityComparer
GroupByにを渡していないので、ドキュメントによると:
デフォルトの等式比較器
Default
は、キーを比較するために使用されます。
EqualityComparer<T>.Default
それはこのようにプロパティを説明します:
プロパティは、 typeがジェネリックインターフェイスを 実装している
Default
かどうかをチェックし、実装している場合は、その実装を使用するを返します。T
System.IEquatable<T>
EqualityComparer<T>
以下のコードでは、Fred
オブジェクトの配列をグループ化しています。FredKey
それらには、を実装する、と呼ばれるキータイプがありますIEquatable<FredKey>
。
グループ化を機能させるにはこれで十分ですが、グループ化は機能していません。以下の最後の行では、2つのグループが必要ですが、そうではありません。3つの入力項目を含む3つのグループがあります。
グループ化が機能しないのはなぜですか?
c# - IEquatableである必要があります、IComparable封印されていないクラスに実装されますか?
誰かがそれを要求するかどうか、または一般的に要求すべきかどうかについて意見がありますかIEquatable<T>
(それが)?IComparable<T>
T
sealed
class
この質問は、不変クラスの実装を支援することを目的とした一連の基本クラスを作成しているときに発生しました。基本クラスが提供することを目的とした機能の一部は、同等性比較の自動実装です(同等性比較を制御するためにフィールドに適用できる属性とともにクラスのフィールドを使用します)。終了したらかなりいいはずです。式ツリーを使用して、それぞれのコンパイル済み比較関数を動的に作成しているT
ので、比較関数は通常の等式比較関数のパフォーマンスに非常に近いはずです。(キー入力された不変の辞書System.Type
とダブルチェックロックを使用して、生成された比較関数を適度にパフォーマンスの高い方法で保存しています)
ただし、発生したことの1つは、メンバーフィールドの同等性をチェックするために使用する関数です。私の最初の意図は、各メンバーフィールドのタイプ(これを呼び出しますX
)が実装されているかどうかを確認することでしたIEquatable<X>
。X
しかし、少し考えてみると、そうでない限り、これは安全に使用できるとは思いませんsealed
。その理由は、そうX
でない場合、の仮想メソッドに等価性チェックを適切に委任sealed
しているかどうかがわかりません。これにより、サブタイプが等価性の比較をオーバーライドできるようになります。X
X
次に、これにより、より一般的な質問が発生します。型が封印されていない場合、これらのインターフェイスを実際に実装する必要がありますか?X
インターフェイスコントラクトは2つのタイプを比較することであり、そうでない場合もある2つのタイプを比較することではないと主張するので、私はそうは思わないでしょうX
(もちろん、X
またはサブタイプである必要があります)。
皆さんはどう思いますか?封印されていないクラスでは避けるべきIEquatable<T>
であり、避けるべきですか?IComparable<T>
(また、これにfxcopルールがあるかどうか疑問に思います)
私の現在の考えは、生成された比較関数をであるメンバーフィールドでのみ使用しIEquatable<T>
、代わりに、フィールドがのサブタイプを格納する可能性があり、のほとんどの実装が継承用に適切に設計されているとは思えないため、実装されている場合でも、仮想ifが封印されていない場合に使用することです。 。T
sealed
Object.Equals(Object obj)
T
T
IEquatable<T>
T
IEquatable<T>
c# - GetHashCode() をオーバーライドする型で Object.GetHashCode() を使用する方法
Equals() の実装/オーバーライドと GetHashCode() のオーバーライドにフィールド (Ab と Ac など) を使用して IEquatable<> を実装するクラス A があり、99% の確率ですべてが正常に動作します。クラス A は、すべてインターフェイス D から継承する階層 (クラス B、C) の一部です。それらはすべて辞書 Dictionary にまとめて格納できるため、すべてが独自のデフォルトの Equals()/GetHashCode() を持っている場合に便利です。
ただし、AI の構築中に、Ab と Ac の値を取得するために何らかの作業を行う必要がある場合があります。それが起こっている間、構築中のインスタンスへの参照を保存したいと思います。その場合、A が提供するデフォルトの Equals()/GetHashCode() オーバーライドを使用したくありません。したがって、オブジェクトの Equals()/GetHashCode() の使用を強制するための ReferenceEqualityComparer を実装することを考えていました。 :
問題は、A が Object.GetHashCode() をオーバーライドするため、(A の外部で) A のインスタンスに対して Object.GetHashCode() を呼び出すにはどうすればよいかということです。
もちろん、A が IEquatable<> を実装せず、作成した辞書に常に IEqualityComparer<> を提供する方法もありますが、別の答えを期待しています。
ありがとう
c# - C#XNA:辞書の問題
私はC#を初めて使用します。IEquatable
同じと見なされるべき私のタイプのオブジェクトはそうではないので、おそらく私は適切に実装していません。
クラス:
(これ以上にCompPoint
、クラスであることを正当化するものがあります。)
次に、このテストは失敗します。
私は何を誤解していますか?Assert.AreEqual()
参照の平等を使用していますか?私のEquals()
機能がCompPoint
台無しになっていますか?
この関数も失敗します:
この理由は、私がを使用してDictionary
いて、期待どおりに機能していないためです。
テストは次のメッセージで失敗します:
テストメソッドShipAILabTest.BoardUtilsTest.dictCompPointTestが例外をスローしました:System.Collections.Generic.KeyNotFoundException:指定されたキーがディクショナリに存在しませんでした。
このテストは私の期待をカプセル化します。キーは毎回同じなので、値が上書きされることを期待しています。Dictionary
平等をテストするために何を使用していますか?
更新: Thomasの提案に従って、等式関数を追加しました。これで、CompPoint
比較テストが機能し、機能しdictCompPointTest
ます。
不思議なことに、このテストはまだ失敗します:
キーが。の場合もテストは失敗しますが、キーがの場合は失敗しnew CompPoint(4, 1)
ませんnew CompPoint(0, 1)
。なぜこれが一部の値で機能し、他の値では機能しないのでしょうか。
さらに謎:ハッシュコード関数はかなりうまく機能していないようです。このテストは失敗します:
ハッシュコード関数は上にリストされています。ここでの問題は何ですか?CompPoint
2つのオブジェクトが同じハッシュコードを持つべきではありませんか?多分私の呼び出しbase.getHashCode()
は問題ですか?
c# - C# Linq 拡張メソッドはどのように等価比較を実行しますか?
したがって、次のラムダ式はコレクション内の要素を返しませんが、ステップ実行中に 1 つの項目が条件に一致することを確認できました。IEquatable 実装を使用してクラスのサンプルを追加しました。
上記は何も返しません。上記の式を機能させるために何をすべきかについて何か提案はありますか?
私が狂っていないことを確認するために、パスする次の nUnit テストを作成しました。
== と != をオーバーライドしようとしています:
c# - IComparable と IEquatable インターフェイスの違いは何ですか?
どちらのインターフェースもオブジェクトを比較して等しいように見えますが、それらの主な違いは何ですか?