問題タブ [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.
dictionary - 2 次元配列の IEqualityComparer インスタンス
=
F# は、演算子を使用した 2 次元配列の構造上の等価性をサポートしており、 Set
. しかし、.NET クラスで同じ等価比較を使用するにはどうすればよいHashSet
でしょうか? デフォルトでは、参照等価性が使用されます。インスタンスを取るコンストラクターがありますがIEqualityComparer<T>
、2 次元配列に適した組み込みインスタンスが見つかりません。
を見ましたSystem.Collections.StructuralComparisons.StructuralEqualityComparer
が、2 つの問題があるようです。第一に、それは一般的ではなく、第二に、2 次元配列をサポートしていないようです:
最終的には、2 ではなく 1 を返すように次のコードを修正したいと思います。
を使用したソリューションにも満足していDictionary
ますが、同じ問題が当てはまると思います。
c# - IEqualityComparerを使用してレコードを検索する
次のIEqualityComparerを使用して、比較する前に会社名から特殊文字を次のように削除しています。
クエリを実行するときにこれを呼び出すために、私は以下を使用します:
入力文字列(会社名)に一致するすべてのレコードを見つけるために、LINQクエリでこの比較子をどのように使用しますか?
例えば:
したがって、t1.Company_Name == nameを使用する代わりに、特殊文字の置換を含めるために、これに等式比較子を使用したいと思います。
c# - 長いプリミティブの GetHashCode()
LINQ 固有の式の EqualityComparer を作成していますが、GetHashCode オーバーロード メソッドについてよくわかりません。以下のコードは正しいでしょうか?Id プロパティは長いプリミティブです。
.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# - HashSet をサブクラス化して、別のセットで使用されたときに常に特定の IEqualityComparer を使用するようにします
別のセット内で使用するたびにとしてHashSet<Point>
使用するようにサブクラス化したい。HashSet<Point>.CreateSetComparer()
IEqualityComparer
基本的に私はこれを行うたびに:
私はそれを自動的に次のように扱いたい:
この質問のとおりです。
現在、次のように手動でこれを行っています。
しかし、それはちょっと醜いです。私が見逃している簡単な方法はありますか?
.net - 開発者の時間を考慮して GetHashCode の単体テストを行う
私の現在のプロジェクトでは、いくつかの IEqualitycomparers があります。
これらは、オブジェクトのいくつかのプロパティを取り、それらを比較します。
プロパティは、値とnullの両方に対して、等しいか異なるかのいずれかです。
これらを単体テストしたいのですが、さまざまな可能性はすべて正気ではありません。これらを効率的にテストするにはどうすればよいですか?
更新
現在、それらは entlib のデータ ブロックで満たされているため、コンストラクターではなくプロパティを介して値を取得します。
例(vb.netでは、C#も話します):
c# - SequenceEqual の IEqualityComparer
C#IEqualityComparer<IEnumerable>
では、メソッドを使用してSequenceEqual
同等性を判断するものはありますか?
.net - IEqualityComparerを使用して動的比較を行う方法は?
私は次のような人のクラスを持っています:
Person オブジェクトのリストを作成します。
GetAllPersons() には、ID に基づいて一意で繰り返しのない人物オブジェクトを提供するこのコードがあります。
つまり、ソースに Id = 123 の人物が 2 人いた場合、123 はリストに表示されません。
IEqualityComparer を実装するクラスは次のとおりです。
MyClass セットは、ID に基づく ID です。
そのプロパティ値に基づいて一意の人物を識別する FirstName や LastName などの人物クラスの ID プロパティを設定する規定がある外部構成ファイルがあります。
したがって、構成ファイルにキーとして「FirstName」と記載されている場合、MyClass は次のようになります。
人物オブジェクトを追加する前に実際に辞書を使用していましたが、ソースに ID 123 の 2 人の人物のような繰り返しエントリがある場合は、1 つの人物オブジェクトが追加されます。外部ソースからの繰り返しレコードを含めないでください。
私ができることは、重複のリストを別のリストに維持することです。そのリストで単純な foreach を実行し、次のように辞書から人物オブジェクトを削除します。
ここでは IEqualityComparer は使用されていません。外部ソースから辞書にレコードを追加し、重複リストに基づいてその辞書をさらにフィルター処理するだけです。
これを行うより良い方法はありますか?
よろしく。
linq - IQueryableのContains()とIEnumerableのContains()の違いは何ですか?
私はIQueryable
custs、cust、を実装Customer
するcustCpを持っています。CustomerComparer
IEqualityComparer
電話をかけるcusts.Contains(cust, custCp)
と、例外が発生します。
しかし、私がそれを呼ぶとき、custs.AsEnumerable().Contains(cust,custCp)
それはうまくいきます。誰かが理由を説明できますか?