ラムダ式を使用して Distinct() メソッドをカスタマイズします
列挙可能なオブジェクトを扱う場合、多くの場合、一意の値を区別する必要があります。 System.Linq 名前空間は Distinct() 拡張メソッドを提供しますが、オブジェクトの等価性を指定するための Lambda 式を受け入れるオーバーロードがありません。
問題
ラムダ式に基づくオーバーロードがないため、プログラマは IEqualityComparer インターフェイスのみを使用できます。これには Equals() メソッドと GetHashCode() メソッドを実装する必要があります。このアプローチは退屈で面倒な場合があります。
ラムダ式ベースの回避策
必要な Lambda 構文に一致する既存の拡張メソッドはありませんが、創造的な回避策で同様の効果を達成できます。 GroupBy() と Select() を使用すると、列挙可能なオブジェクトを変換できます:
<code class="language-csharp">IEnumerable<customer> filteredList = originalList .GroupBy(customer => customer.CustomerId) .Select(group => group.First());</code>
指定したキーで要素をグループ化し、各グループから最初の要素を選択することで、GroupBy() で提供される Lambda 式に基づいて一意のリストを効果的に作成できます。
ラムダ式に基づく等価問題
ラムダ式ベースの等価比較器は、特定の型 (文字列など) に対して予期しない動作を引き起こす可能性があることに注意することが重要です。固有の操作を確実に実行するには、GetHashCode() の正確で一貫性のある実装を保証する必要があります。
さらに詳しい情報
.NET チーフ アーキテクトの Anders Hejlsberg が、ラムダ式ベースの Distinct() オーバーロードの制限について説明します。その理由は、Distinct() 内のハッシュ テーブルが互換性を適切に機能させるには、Equals() と GetHashCode() の間にギャップが必要であるためです。
以上がC#でlambda式を使用して異なるリストを効率的に作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。