問題タブ [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.
.net - IEnumerable に要素があるかどうかを判断するタイプ U にキャストできます
IEnumerable<T>
.net の新しいバージョンでは、またはを受け入れる拡張メソッドがいくつかありIEnumerable
ます。そのようなメソッドの 1 つはOfType<TResult>
、指定された type にキャストできる元のシーケンスの要素のみを含む列挙型を返すメソッドですT
。IEnumerable
このメソッドは、元のリストのタイプと宛先のタイプに関係なく、非ジェネリックを使用して元のリストのすべてのアイテムを処理することを完全にうまく処理します。元のリストが であり、 である場合、元のIEnumerable<int>
をTResult
そのまま使用できる場合でもint
、元のリストの各項目を非ジェネリックとして取得しobject
、キャストしますIEnumerator<int>
。元のリストがIEnumerable<int>
andTResult
の場合StringBuilder
、元のリストのすべてのアイテムを宛先タイプにキャストできない場合でも、同様にすべてのアイテムをボックス化します。
IEnumerable<TSrc>
を受け取って に変換するメソッドを作成IEnumerable<TResult>
し、元の列挙のすべての項目が後者に現れることが保証されている場合、またはソース列挙子の型が後者が空になることを暗示しています(IEnumerable
タイプサポートのすべてのバリエーションが同じアイテムのシーケンスを返すと仮定して)?確かに、シーケンスを既に保持している型にキャストしようとすることはそれほど多くありませんが、重複する場合と重複しない場合がある複数の型パラメーターを持つジェネリック クラスを持つことは珍しくありません。
c# - リストを作成するためにどのインターフェースを実装する必要がありますかまたは辞書2 つの値をキーとして連結する
カスタム オブジェクトをディクショナリ、リストなどで正しく機能させる必要があります。これにより、オブジェクトのプロパティを変更し、再ソートして孤立させないようにすることができます。
前回 GetHashCode() のオーバーライドを試みたとき、オブジェクトをディクショナリに追加したときにオブジェクトを孤立させ、オブジェクトに変更を加えた (GetHashCode が変更された) ため、ディクショナリがメモリからオブジェクトを適切に破棄できませんでした。
質問
誰かが説明できますか:
int
ソートされたディクショナリで連結してTrustedEntity
正しく機能させるために、TrustedEntityReference でオーバーライドする必要があるインターフェイスとインターフェイスは何ですか?.NET ディクショナリ オブジェクトで使用されているものに関して変更してはならない値、またはオブジェクトを孤立させるリスクがある値はどれですか? (たとえば、オブジェクトの発行されたハッシュコードを変更すると、辞書で GC の問題が発生する可能性があります)
これは、私が取り組んでいる現在のサンプル オブジェクトです。
c# - GetHashCode()をオーバーライドするときにGuid()。GetHashCode()を使用することの欠点は何ですか
このようなGetHashCode()の実装を見つけました
Equalsは正しいように見えますが、この実装によって.NETに関する多くの仮定が破られると言うのは正しいですか?
私が聞いている反論は、オブジェクトが作成された後はGetHashCodeを変更する必要がないというものです。これは、このオブジェクトが辞書に保存されているためです。
誰かが私のためにこれを片付けて、オブジェクトが変更された場合にGetHashCodeに何が起こる必要があるかを説明できますか?それは最終的にEqualsメソッドを変更しますか?
c# - GetHashCode() の戻り値は、元のオブジェクトの状態または変更されたオブジェクトの状態に基づくべきですか?
私は最近、いくつかの異なる方法でこの質問をしましたが、変化するものへの参照を保持するときに Dictionary をどのよう<T,U>
に処理する必要があるかを示す答えが得られませんT.GetHashCode()
。この質問の目的上、「状態」とは、 がチェックされているときにもチェックされるプロパティとフィールドを指しEquals()
ます。すべての public、internal、および protected メンバーが含まれていると想定します。
私がC#オブジェクトを持っているとすれば
GetHashCode と Equals をオーバーライドします
このオブジェクトはキー値としてディクショナリに保存されます (ディクショナリはこの時点で GetHashCode 値を読み取ることに注意してください)。
Key でオブジェクトを検索し、値を変更します。(この値を変更すると、カスタム equals 関数が変更され、場合によっては gethashcode が変更されます)
私の質問は、GetHashCode は何を反映する必要があるかということです。この関数の戻り値は、オブジェクトの元の状態または変更された状態を反映する必要がありますか?
サンプルコード
Jon Skeet からのこの回答に基づいて(以前の質問に対して)
「最終的にキーの値を変更するプロパティを変更したら、どうすればよいですか?」- 自分
.
「基本的に、あなたは詰め物をしています。辞書でそのキーを再び見つけることはできません (または、少なくともおそらく不可能です)。できる限り慎重にこれを避ける必要があります。個人的には、通常、辞書キーの有力な候補は、不変性の有力な候補でもあります。」-JS
これは、辞書からオブジェクトを削除して、再度追加する必要があるということですか? これは適切な/最善の方法ですか?
.net - IEquatable(Of T)/IEqualityComparer(Of T) が呼び出されない
オブジェクトの 2 つのリストを含むコードがあります。最初のリストは、2 番目のリストよりも包括的です。最初のリストから 2 番目のリストの項目を除外したいと考えています。いくつかの調査の後、拡張メソッドExcept
がこれを行う方法であることがわかりました。そのため、次のようなコードを実装IEquatable(Of T)
しました。IEqualityComparer(Of T)
次に、次のような簡単な呼び出しを行います。
これはうまくいきません。これもありません:
ただし、これは機能します。
RecentCustomers
とLocalCustomers
が両方ともあるのでList(Of CustomerData)
、デフォルトの比較メソッドが機能しないのはなぜですか? うまくいかないというのは、Equals
とのGetHashCode
ルーチンにブレーク ポイントを入れることができ、それらがヒットすることはなく、返されるリストが のリストと同じであることを意味しますLocalCustomers
。
c# - リストを上書きする方法含まれています
List [MyObject]を使用して、オブジェクト全体ではなくプロパティを比較したいと思います。したがって、IEquatable [MyObject]を使用しますが、コンパイラは文字列プロパティの代わりにMyObjectを必要とします。なんで?
これが私が得たものです:
c# - IEquatable を実装している場合、Equals をオーバーライドすることは重要ですか??
GetHashCode
カスタム等価チェックを実装するときにオーバーライドすることの重要性を知っています-そのためにインターフェイスを実装しました。また、ここで説明したIEquality<T>
ジェネリックと非ジェネリックの違いも知っています。オーバーライドするポイントはありますか?すべてがジェネリックに分類されませんか?Equals
Equals(object t)
Equals(T t)
c# - 2 つのカスタム クラス オブジェクトの比較に問題がある
アプリケーション用にこのカスタム クラスがあります。このクラスには 2 つのインスタンス (A と B) があり、比較しようとしています。ただし、問題があります。IEquatable<T>
オーバーライドされたメソッドを使用して、この比較を行うためのインターフェイスを実装して いますEquals
。
Equals
メソッドは関数を呼び出しますが、ReferenceEquals
これは動作が正しくありません。
テストケースは次のとおりです。
ケース 1: A と B は異なるインスタンスであり、異なるデータが含まれています..ReferenceEquals
言う: それらは異なります (これは正しいです!)
ケース 2: A と B は異なるインスタンスですが、B は A の変数値を使用してインスタンス化されました (つまり、A と B の両方にまったく同じデータが含まれています!) ..ReferenceEquals
言う: それらは異なります (これは間違っています!)
ケース 3: A と B が同じインスタンスである (つまり、A が 2 回渡されるなどEquals (A, A)
)ReferenceEquals
と言う: それらは同じです (これは正しいです!)
では、ケース 2 の結果も正しいものにするにはどうすればよいでしょうか。
IEquatable<T>
が実装されているクラス:
メソッドを呼び出すコードEquals
(ここではケース 2 用に構成):
では、このコードの問題は何ですか?
c# - GetHashCodeは実装されていますが、Dictionaryがキーを見つけることができませんか?
私のクラスでは、とを実装Equals
しGetHashCode
ました。それでも、C#コードで辞書のキーとして使用すると、エラーが発生します:"Key not found exception"
ありがとう、
そして私がそれを使用しているコード:
..。
vb.net - IEquatable(Of T).Equals の推奨命名規則は?
クラスに実装IEquatable(Of T)
し、Visual Studio (2010) に必要なEquals
メソッドを自動生成させると、次のようになります。
1
Object.Equals との名前が競合するため、追加の必要があることに注意してください。この関数に 以外の名前を付けるための規則/提案はありEquals1
ますか? 率直に言って、それはかなり醜いからです。