そうです、私は列挙可能であり、そこから明確な値を取得したいと考えています。
使用してSystem.Linq
、と呼ばれる拡張メソッドは、もちろんありますDistinct
。単純なケースでは、次のようにパラメーターなしで使用できます。
var distinctValues = myStringList.Distinct();
ええと、いいのですが、等価性を指定する必要があるオブジェクトの列挙可能オブジェクトがある場合、使用できる唯一のオーバーロードは次のとおりです。
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
等価比較引数はのインスタンスでなければなりませんIEqualityComparer<T>
。もちろん、私はこれを行うことができますが、それはいくぶん冗長で、まあまあです。
私が期待していたのは、ラムダをとるオーバーロード、たとえばFunc <T、T、bool>です。
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
誰かがそのような拡張機能が存在するかどうか、または同等の回避策を知っていますか?それとも何か不足していますか?
または、インラインでIEqualityComparerを指定する方法はありますか(私を当惑させます)?
更新
この件に関するMSDNフォーラムの投稿に対するAnders Hejlsbergからの返信を見つけました。彼は言う:
あなたが遭遇する問題は、2つのオブジェクトが等しい場合、それらは同じGetHashCode戻り値を持つ必要があることです(そうしないと、Distinctによって内部的に使用されるハッシュテーブルが正しく機能しません)。EqualsとGetHashCodeの互換性のある実装を単一のインターフェイスにパッケージ化するため、IEqualityComparerを使用します。
それは理にかなっていると思います
.Distinct(new KeyEqualityComparer<Customer,string>(c1 => c1.CustomerId))
、とGetHashCodeメソッド()が正常に動作することが重要である理由を説明します。