問題タブ [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# - C# で複数型 IComparable / IEquatable を実装する方法
次のクラスがあるとしましょう:
クラスを a に匹敵するものにしたい場合は、そのようdouble
に含めIComparable<double>
て実装する必要がありますか、それとも別の方法で行う必要がありますか?
そして、クラスを double に匹敵するようにしたい場合は、 ?double.CompareTo
と同じ結果が得られるはずです。ScaleValue.CompareTo
そしてどうEquals
ですか?
私は自分の設計で責任を間違っていると思います。私の最善の選択肢は、ContainsValue(double Value)
メソッドを使用して Scale クラスを作成することだと思います。このようにして、価値を調べて、必要な場所に責任を持たせることができます。
c# - EqualityComparerer.Default.Equals() vs object.Equals() とポリモーフィズム
もう一度平等について話し合っていて、偶然見つけましたEqualityComparer<T>.Default.Equals()
。私はこのメソッドをobject.Equals()
.
今、私はひどく間違っていたと思います。
object.Equals()
実装されている場合は呼び出しますがEquals()
、正しいポリモーフィック動作を提供するオーバーライド可能なインスタンス メソッドを使用します。EqualityComparer<T>.Default.Equals()
IEquatable<T>.Equals()
この小さなプログラムを考えてみましょう:
これは、平等のセマンティクスに矛盾をもたらしやすいことを示しています。
Object.Equals()
C1=C2 False
C2=C1 False
C2=C3 False
C3=C2 False
EqualityComparer<Class1>.Default.Equals
C1=C2 False
C2=C1 False
C2=C3 True バグ?
C3=C2 本当のバグ?
ただし、 MSDN ドキュメントでは次のことを推奨しています。
実装者への注意 Equals を実装する場合は、Object.Equals(Object) および GetHashCode の基本クラスの実装もオーバーライドして、それらの動作が IEquatable<T>.Equals メソッドの動作と一致するようにする必要があります。Object.Equals(Object) をオーバーライドする場合、オーバーライドされた実装は、クラスの静的 Equals(System.Object, System.Object) メソッドの呼び出しでも呼び出されます。さらに、op_Equality および op_Inequality 演算子をオーバーロードする必要があります。これにより、等しいかどうかのすべてのテストで一貫した結果が返されることが保証されます。これは例が示しています。
この瞬間からIEquatable<T>
、参照型を実装する理由がわかりません。意味があるときは誰か教えてもらえますか?型を (基本型として) 別の方法で見た場合、異なる等価動作を一貫性のないものとして扱うべきでしょうか?
c# - IEquatable Equals を使用して、配列内のオブジェクトのプロパティを比較する
古典的なポーカー/カード ゲーム タイプのプログラムでフラッシュを作ろうとしています。プロパティはスート (ハート、ダイヤなど) で、配列はハンドです。私はIEquatableを使用し、Equalsメソッドを実装しました
そこから Program.cs で、.Equals を使用して、Flush の bool メソッドを作成しています。for ループを使用するように提案されましたが、これを正しく行っているかどうかを理解するのに苦労しています。cardSuit プロパティをカードごとに比較する必要があります。しかし、私はそれについてどうやって行くのか分かりません。どんな助けでも大歓迎です。これまでの方法で私が持っているものは次のとおりです。
私の考えでは、for ループは各カードを比較して false を探し、そうであれば false を返します。for ループの外側/後 (それらがすべて true であると仮定)、ハンドの最後の 2 枚のカードの比較の true/false を返します。私はそれを複雑にしすぎていますか?違いますか?
編集:私はこれを見ることができます:「if (hand[i].Equals(hand[i + 1]) == false)」は範囲外の例外になるため、カードとカードを比較する新しい方法が必要です。何か案は?
c# - リストの比較別のリストで
リストを互いに比較する方法について読んでいます。IEquatable
インターフェイスを実装しようとしました。これが私がこれまでに行ったことです:
これが私がそれを使用する場所です:
デバッグして equals 関数にブレークポイントを設定すると、ヒットすることはありません。
これは、私がそれを間違って実装したか、それとも正しく呼び出していないと思いますか?
c# - オブジェクトの現在の状態のため、IEquatable 操作は有効ではありません
C# でプロジェクトを開発していますが、最近、理解できないエラーが発生しました。
まずはここが核心
そして、問題を引き起こす getGroupe 関数は次のとおりです。
そのため、あるランダムな瞬間に、移動が完了すると、オブジェクトの現在の状態が原因で IEquatable 操作が有効ではありません。スタック トレースは次のとおりです。
したがって、142行目は
そして155は
this.Groupes は最初は空なのでわかりません。グループを探す前に空かどうかを確認するテストを行いましたが、何も変わりませんでした...
c# - ディクショナリのキーとして使用する IEquatable のクラス実装
2 つの文字列と列挙型で構成されるクラスがあります。このクラスのインスタンスを辞書のキーとして使用しようとしています。残念ながら、私は IEquatable を適切に実装していないようです。これが私がやった方法です:
しかし、まだ辞書の項目を調べることができないようです。さらに、次のテストは失敗します。
誰かが私が間違っているところを指摘できますか? かなり単純なものが欠けていると確信していますが、何がわかりません。
c# - IEquatable の実装と演算子のオーバーライド
ドメイン クラスT
のタイプは次のValueObject<T>
とおりです。
ValueObject<T>
インターフェイスを実装しIEquatable
ます。ValueObject<T>
の具体的な実装ごとに の実装を提供したいbool Equals(T obj)
ので、抽象メソッドとして作成しました。
Coordinate
クラスの Equals 実装:
ValueObject<T>
== (および、上には示されていない !=) の一般的な操作のオーバーライドを提供します。これは、すべての具体的な実装に適用されます。
問題は、メソッドが == オーバーライドから呼び出されたときに、 ではなくEquals
を呼び出すことです。Object.Equals()
Coordinate.Equals()