C# リスト間の違いの比較と特定
2 つのリスト間の違いを効率的に判断することは、C# プログラミングにおける一般的なタスクです。 .Except()
メソッドは強力なソリューションを提供しますが、特にカスタム オブジェクトを操作する場合、その適用方法は微妙な場合があります。
参照型が等しい .Except()
を使用する
CustomObjects
メソッドと Equals()
メソッドを正しくオーバーライドするカスタム オブジェクト (GetHashCode()
など) の場合、.Except()
を使用するのは簡単です。
<code class="language-csharp">var list3 = list1.Except(list2).ToList();</code>
これにより、list3
にはない list1
の要素を含む list2
が作成されます。
IEqualityComparer
特定のプロパティ (Id
など) に基づく比較など、より複雑な等価性チェックには、IEqualityComparer<T>
インターフェースを実装する必要があります。 以下に例を示します:
<code class="language-csharp">public class IdComparer : IEqualityComparer<CustomObject> { public int GetHashCode(CustomObject co) => co.Id.GetHashCode(); public bool Equals(CustomObject x1, CustomObject x2) => x1.Id == x2.Id; }</code>
次に、この比較子を .Except()
とともに使用します:
<code class="language-csharp">var list3 = list1.Except(list2, new IdComparer()).ToList();</code>
重複要素の処理
標準の .Except()
は重複を削除します。 それらを保存するには、次の代替手段を使用します:
<code class="language-csharp">var set2 = new HashSet<CustomObject>(list2); var list3 = list1.Where(x => !set2.Contains(x)).ToList();</code>
これは効率的なメンバーシップチェックのために HashSet
を利用しており、結果として重複が保持された list3
が生成されます。 list3
内の要素の順序は、元の list1
と異なる場合があることに注意してください。
以上がC# で .Except() と IEqualityComparer を使用して 2 つのリスト間の違いを効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。