そうです、列挙可能なものがあり、そこから個別の値を取得したいと考えています。
を使用する場合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 フォーラムで彼はこう述べています。
遭遇する問題は、2 つのオブジェクトが等しいと判断された場合、それらの GetHashCode 戻り値が同じでなければならないことです (そうでない場合、Distinct によって内部的に使用されるハッシュ テーブルは正しく機能しません)。IEqualityComparer を使用するのは、Equals と GetHashCode の互換性のある実装を 1 つのインターフェイスにパッケージ化しているためです。
それは理にかなっていると思います。
ベストアンサー1
IEnumerable<Customer> filteredList = originalList
.GroupBy(customer => customer.CustomerId)
.Select(group => group.First());