C# での汎用カスタム オブジェクト リストの差分抽出
それぞれにカスタム オブジェクトが含まれる 2 つのリストがあり、最初のリストには存在するが 2 番目の要素には存在しない項目のみを含む 3 番目のリストを取得する方法が必要だとします。
この目的には、.Except()
メソッドが適切なオプションです。このメソッドは、カスタム オブジェクトが 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> { public int GetHashCode(CustomObject co) { if (co == null) { return 0; } return co.Id.GetHashCode(); } public bool Equals(CustomObject x1, CustomObject x2) { if (object.ReferenceEquals(x1, x2)) { return true; } if (object.ReferenceEquals(x1, null) || object.ReferenceEquals(x2, null)) { return false; } return x1.Id == x2.Id; } }</code>
この場合、次のコードを使用して 2 つのリストの差分を取得できます。
<code class="language-csharp">var list3 = list1.Except(list2, new IdComparer()).ToList();</code>
重複が存在する場合は、2 番目のリストからセットを作成し、次の方法を使用することを検討してください:
<code class="language-csharp">var list3 = list1.Where(x => !set2.Contains(x)).ToList();</code>
これにより、結果リストに重複が確実に保持されます。
以上がC# でカスタム オブジェクトの 2 つのリスト間の違いを効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。