1. ホーム
  2. c#

[解決済み] Distinct() with lambda?

2022-03-22 02:11:05

質問

そう、私は列挙可能なものを持っていて、そこから個別の値を取得したいのです。

使用方法 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);

このような拡張機能があるか、または同等の回避策をご存知の方はいらっしゃいますか?あるいは、私が何かを見逃しているのでしょうか?

あるいは、(1)のように IEqualityComparer をインラインで表示できますか(恥ずかしい)?

更新情報

に対するAnders Hejlsbergの返答を発見しました。 ポスト この件に関して、MSDNフォーラムにて。彼はこう言っています。

あなたが遭遇する問題は、2つのオブジェクトを比較する際に は、同じ GetHashCode の戻り値でなければなりません(そうでなければ Distinct が内部で使用するハッシュ テーブルは正しく機能しません)。 IEqualityComparerを使用する理由は、互換性があるからです。 Equals と GetHashCode の実装を1つのインタフェースにまとめたものです。

なるほど、納得です。

解決方法は?

IEnumerable<Customer> filteredList = originalList
  .GroupBy(customer => customer.CustomerId)
  .Select(group => group.First());