問題タブ [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.
c# - カスタム IEqualityComparer を介して 2 つの EntityCollections と交差する
この質問をあまり繰り返さないでください。しかし、私はすでに検索を行っており、結果は空でした。したがって、タイプ T の 2 つの EntityCollections があり、それぞれに共通の項目を見つけたいと考えています。キャッチ?1 つを除くすべてのフィールドが一致する必要があります。たとえば、タイプ T がタイプ CustomSet であり、CustomSet にフィールド F1、F2、F3 および FK フィールド OtherId が含まれている場合、F1、F2、および F3 は一致する必要があり (文字列、int、実際には何でもかまいません)、OtherId は決して一致しません。マッチ。私の現在の実装:
フィールド F1、F2、および F3 が一致する場合でも、OtherId 列が他のコレクションで一致することはないため、結果は得られません。そこで、次のような IEqualityComparer のカスタム実装を提案します。
今、私はこれをテストしているだけなので、渡される obj は CustomSet 型です。これを適切に機能させることができれば、他の型に必要な if ステートメントを追加します。Intersect 拡張機能は、Equals の代わりに GetHashCode を使用して項目を比較することを知っています。これが、EntityCollections の Intersect 拡張機能以外では、このクラスが呼び出されることはないため、equals の内容を本当に気にしない理由です。問題は、これは機能しないということです。私のテスト セットでは、「ソース」コレクションに 28 個のアイテムがあり、「宛先」コレクションに 28 個のアイテムがあり、すべてのフィールドが一致していることがわかります (もちろん、OtherId フィールドを除く)。GetHashCode コードは 56 回ループし、各セットの 28 アイテムすべてのハッシュ コードを一致させることができましたが、「交差」は 0 カウントでした。私が間違っていること、または欠けていることはありますか?ありがとう。}
c# - オブジェクト内のIEqualityComparer文字列値
私はおそらくこれを間違った方法で行っていますが、
LINQにオブジェクトのリストがあります。
ここで、そのリスト内のオブジェクトに文字列値があるかどうかを確認しようとしています。
ので、私は持っています;
私が持っている比較器では;
比較ツールを使用して、オブジェクトフィールドの文字列値と照合するにはどうすればよいですか?
visual-studio - Visual Studio での単体テスト: Assert.AreEqual を使用できるようにするには、クラスに何を実装すればよいですか?
(Visual Basic) プロジェクトに単体テストを追加しています。Visual Studio (2010 Premium) のテスト ツールを使用しています。いくつかのテストでは、自分のクラスが Assert.AreEqual を使用してクラスの期待値と等しいことを確認したいと思います。しかし、これはそのままでは機能しません。
Equals メソッドをオーバーライドして IEqualityComparer インターフェイスを実装するか、それとも ...?
c# - IEqualityComparerを実装していないLINQ
クラスの異なる2つのコレクションがあります。MyClass1-名前、年齢などMyClass2-ニック、年齢など
このコレクション以外を見つけたいです。何かのようなもの
list1.Exept(list2, (l1,l2) => l1.Name==l2.Nick);
しかし、私はこのコードを書くことができず、IEqualityComparerインターフェイスを使用して独自の比較クラスを実装する必要があります。この小さなタスクでは非常にオーバーヘッドが発生します。エレガントな解決策はありますか?
c# - IEqualityComparer を使用する理由GetHashCode() メソッドを持っていますか?
名前空間のIEqualityComparerSystem.Collections.Generic
には、次のメソッドがあります。
このインターフェイスはオブジェクトの等価性をチェックするために使用されるため、最初の方法Equals
が理にかなっています。しかし、なぜ実装する必要があるのGetHashCode
でしょうか。そもそもなぜインターフェースに存在するのですか?いつ、なぜ必要なのですか?
名前空間のEnumerable.Distinct()メソッドで使用してSystem.Linq
いGetHashCode()
ますEquals()
。なんで?どのように機能しDistinct
ますか?
c# - 2 つの辞書を比較する最良の方法平等のために
これは、2 つの辞書が等しいかどうかを比較する比較子を作成する最良の方法ですか? これは正確である必要があります。Entity.Columns は KeyValuePair(string, object) の辞書であることに注意してください。
また、GetHashCode の実装についてもよくわかりません。
ありがとう!
c# - IEqualityComparer の使用に失敗することを除いて、カスタム オブジェクト
オブジェクトコードは次のとおりです。
そして、次の2つのリストがあります。
delItems には常に両方の項目が含まれます。ここで何が欠けていますか?
編集: コードは IEquatable を実装するようになりました
.net - Enumerable.SequenceEqualおよび EqualityComparer
MSDNから
SequenceEqual(IEnumerable, IEnumerable) メソッドは、2 つのソース シーケンスを並行して列挙し、TSource の既定の等値比較子 Default を使用して、対応する要素を比較します。デフォルトの等値比較子である Default は、IEqualityComparer ジェネリック インターフェイスを実装する型の値を比較するために使用されます。
a) 上記の引用を理解しているように、が EqualityComparer<T>.Default
を実装する型の要素を比較するために使用されることを暗示しています。IEqualityComparer<T>
Default
IEqualityComparer<T>
IEquatable<T>.Equals
T
IEquatable<T>
Object.Equals
TSource
b)引用は、実装する必要があることも示唆してIEqualityComparer<T>
いますが、これは真実ではありません:
それで、引用が伝えようとしていることを誤解したのでしょうか、それとも引用が間違っているのでしょうか?
ありがとうございました
c# - EqualityComparer.Default は十分に賢くありません
のソースコードを読んでEqualityComparer<T>.Default
いて、それほど賢くないことがわかりました。次に例を示します。
その理由は、EqualityComparer のプライベート メソッドのソース コードから明らかです。
を見てEqualityComparer<int>.Default
、メソッドが次のような賢明な比較子を取得EqualityComparer<MyEnum>.Default
できます。EqualityComparer<long>.Default
Equals
上記の 2 つは賢いですが、EqualityComparer<AnotherEnum>.Default
不運です。最終的に確認できるメソッドから、 が得られますObjectEqualityComparer<T>()
。そのEquals
メソッドはおそらく次のようになります。
Enum.GetUnderlyingType(c) == typeof(int)
この条件は無意味だと思います。列挙型の基になる型が int 型の場合、メソッドはint のデフォルトの比較子をこの列挙型に変換できます。しかし、なぜ long に基づく列挙型を使用できないのでしょうか? そんなに難しくないですよね?何か特別な理由は?のような比較子を構築するx == y
ことは、列挙型にとってそれほど難しくありませんよね? ついにObjectEqualityComparer<T>
列挙型の速度が低下するのはなぜですか(正しく動作しても)?
c# - EqualityComparer.Default vs. T.Equals
MyClass<T>
タイプの2つのオブジェクトを比較する必要があるジェネリックがあるとします<T>
。通常、私は次のようなことをします...
ここで、のようなMyClass<T>
カスタムの受け渡しをサポートするコンストラクターがあるとします。その場合、私はする必要があります...IEqualityComparer<T>
Dictionary<T>
_comparer
この長いifステートメントを削除するには、通常のコンストラクターを使用する場合に、デフォルトを「デフォルトの比較子」にすることができればよいでしょう。のようなものを検索しましたが、そのようなものtypeof(T).GetDefaultComparer()
は見つかりませんでした。
私は見つけましたEqualityComparer<T>.Default
、私はそれを使うことができますか?そして、このスニペットは...
o1.Equals(o2)
...考えられるすべてのケースで使用するのと同じ結果を提供しますか?
(補足として、これは、特別なジェネリック制約も使用する必要があることを意味し<T>
ますか?)