リストを区別するためにオブジェクトの比較をカスタマイズします
カスタム オブジェクトを含む 2 つの汎用リストを扱う場合、一方のリスト内の固有の要素 (特に、もう一方のリストに存在しない要素) を抽出することは便利な操作です。
.Except()
メソッドは、これに対する効率的な解決策を提供します。 2 つのリスト引数を受け入れ、最初のリストにはあるが 2 番目のリストには見つからない項目を含む新しいリストを返します。
等価性とデフォルトの比較をオーバーライドします
カスタム オブジェクト タイプが Equals()
メソッドと GetHashCode()
メソッドをオーバーライドする場合は、次のように .Except()
を使用できます。
<code class="language-csharp">var list3 = list1.Except(list2).ToList();</code>この場合、オブジェクトの比較はオーバーライドされたメソッドに依存します。等価性の差異はリスト間の差異に反映されます。
カスタム等価比較器
ただし、等価基準にカスタム実装が必要な場合は、独自の を定義できます。比較の基準として ID を使用する例を次に示します: IEqualityComparer<T>
<code class="language-csharp">public class IdComparer : IEqualityComparer<customobject> { // ... (实现如提供的答案中所示) }</code>このカスタム コンパレーターは、
を介して .Except()
で使用できます。
<code class="language-csharp">var list3 = list1.Except(list2, new IdComparer()).ToList();</code>このカスタマイズされた比較により、
操作が特定の等価性要件を満たしていることが保証されます。 .Except()
重複を保持
は重複する要素を除外することに注意してください。重複を保持する必要がある場合、別の方法は 2 番目のリストを .Except()
に変換し、これを使用することです: HashSet
<code class="language-csharp">var list3 = list1.Where(x => !set2.Contains(x)).ToList();</code>このメソッドは、重複を含む、結果のリスト
内のすべての一意の要素を保持します。 list3
以上がC# でカスタム オブジェクトの 2 つのリスト間で異なる要素を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。