ホームページ >バックエンド開発 >C++ >C# で .Except() と IEqualityComparer を使用して 2 つのリスト間の違いを効率的に見つけるにはどうすればよいですか?

C# で .Except() と IEqualityComparer を使用して 2 つのリスト間の違いを効率的に見つけるにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-23 00:58:10250ブラウズ

How Can I Efficiently Find the Difference Between Two Lists in C# Using .Except() and IEqualityComparer?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。