問題タブ [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# - WinRT ソリューションに IEquatable を実装しますか?
だから私は少し問題があります。どれだけうまく説明できるか見てみます。
Windows Phone のフォアグラウンド アプリとバックグラウンドの間でリンクとして共有されるクラスがあります (両方とも同じファイルを使用します)。これは、データがこのクラスからシリアル化されて渡されるためです。
フォアグラウンド プロセスでは、IEquatable を使用して GetHash と Equals をオーバーライドできるようにしたいので、ItemModel で ObservableCollection.Remove を呼び出すと、参照に基づいて削除されず、選択したアイテムを削除するときにプロパティを手動で比較できます。別のリストから (つまり、2 つの同一のアイテムがそれぞれメモリ内に独自のスポットを持っている)。
テストしたところ正常に動作しましたが、Windows ランタイム インターフェイスに IEquatable を実装できません (とにかくよくわかりませんが、問題ありません) "Error 10 Type 'Project.ViewModels.ItemModel ' implements interface 'System.IEquatable' 、これは Windows ランタイム インターフェイスではありません。エクスポートされた型によって実装されるすべてのインターフェイスは、Windows ランタイム インターフェイスである必要があります。」
そのため、フォアグラウンド プロセスでは IEquatable が許可されますが、バックグラウンドでは許可されませんが、リンクされたファイルを使用しているためです。バックグラウンド プロジェクトでこのクラスの複製を作成し、IEquatable を実装しないのはなぜですか? 2 つのクラスがまったく同じように定義されていないときに、データのシリアライズとデシリアライズで問題が発生し始めたからです。
.net - Equals Equals 内の間違った代入を削除します
次のクラスを使用して、次のように見えるいくつかのオブジェクトを比較しています。
私は正しく比較することができます比較例:
しかし、Remove で問題が発生しました。コンストラクターに何を送信しても、メソッドは常に Equals の最初の列挙値 PartId になります。なぜですか?
c# - ハッシュセットまたは他のコレクションで継承されたオブジェクトを使用するときに、Equals(object) が Equals(T) よりも優先されるのはなぜですか?
Equals(object)
をGetHashCode()
実装するときは常にオーバーライドする必要があるという事実を認識していますIEquatable<T>.Equals(T)
。
Equals(object)
ただし、状況によっては、ジェネリックよりも優先される理由がわかりませんEquals(T)
。
たとえば、なぜ次のようなことが起こっているのでしょうか? インターフェイスを宣言IEquatable<T>
し、具体的な型を実装すると、それらの型の項目を相互に比較するときX
に、ジェネラルEquals(object)
が a によって呼び出されます。Hashset<X>
サイドの少なくとも 1 つがインターフェイスにキャストされる他のすべての状況では、正しいものEquals(T)
が呼び出されます。
デモ用のコード サンプルを次に示します。
c# - なぜ IntPtr は IEquatable を実装しないのですか??
アプリケーションでかなり大量のガベージ コレクターの停止が見られたので、プロファイルを作成したところ、これ以上のことを行わない私のメソッドによって大量のガベージが生成されていることがわかりました。
return Address.Equals(other.Address)
はどこAddress
にありますかIntPtr
。
ほとんどの値型のように実装されてIntPtr
いないことが判明したため、毎回IEquatable<T>
ボクシングをしていました。other.Address
そのインターフェースを実装しない正当な理由はありますかIntPtr
、それとも見落としですか?
c# - GetHashCode 実装でのコレクションの処理
この回答hereの HashCode 構造体に基づいて GetHashCode() の実装に取り組んでいます。Equals メソッドは Enumerable.SequenceEqual() を使用してコレクションを考慮するため、GetHashCode() 実装にコレクションを含める必要があります。
出発点として、Jon Skeet の組み込み GetHashCode() 実装を使用して、HashCode 構造体実装の出力をテストしています。これは、以下の次のテストを使用して期待どおりに機能します-
次のステップは、GetHashCode() 計算でコレクションを考慮することです。これには、MyObjectEmbeddedGetHashCode の GetHashCode() 実装に少し追加する必要があります。
ただし、これは HashCode 構造体では少し難しくなります。この例では、List 型のコレクションが Hash メソッドに渡されると、T は List なので、obj を ICollection または IEnumberable にキャストしようとしても機能しません。IEnumerable に正常にキャストできますが、ボクシングが発生し、IEnumerable を実装する文字列などの型を除外することについて心配する必要があることがわかりました。
このシナリオで obj を ICollection または IEnumerable に確実にキャストする方法はありますか?
c# - リストのカスタムの内容c#
リストで List.Contains を使用しようとしています 比較するオブジェクトは C# のサービス リファレンスから取得され、それらの Equals メソッドは私のニーズに合いません。
私はIEquatablesを調べたり、「与えられた」オブジェクトでEqualsメソッドをオーバーライドする方法を調べたりしましたが、これに対する解決策が見つからないようです。これを行う効率的な方法を知っている人はいますか?
arrays - タイプ [SomeProtocol] の配列内のオブジェクトのインデックスを検索します
プロトコル JABPanelChangeSubscriber に準拠するオブジェクトを格納する、サブスクライバーという配列があります。プロトコルは次のように宣言されます。
私の配列は次のように宣言されています:
ここで、サブスクライバーをリストに追加するメソッドを実装する必要がありますが、まず、そのサブスクライバーがまだ以前に追加されていないことを確認する必要があります。
残念ながら、JABPanelChangeSubscriber は Equatable ではなく、Equatable にする方法がわからないため、find メソッドでエラーが発生します。誰かが修正または別のアプローチの提案で私を助けることができますか?
ありがとう