ラムダを使ったDistinct()?質問する

ラムダを使ったDistinct()?質問する

そうです、列挙可能なものがあり、そこから個別の値を取得したいと考えています。

を使用する場合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());

おすすめ記事