カスタム オブジェクトに対する LINQ の個別メソッドの非効率性への対処
LINQ の Distinct()
メソッドは、カスタム オブジェクトで使用すると非効率になる可能性があります。 これは、デフォルトでは参照の等価性に依存しているためです。つまり、2 つのオブジェクトが異なるメモリ位置を占有している場合にのみ、それらのオブジェクトが異なるものとみなされます。 同一のオブジェクト (同じプロパティ値を持つ) は別個のエンティティとして扱われるため、結果が重複します。
解決策は、カスタム オブジェクト クラス内に IEquatable<T>
インターフェイスを実装することにあります。これにより、メモリ アドレスではなくプロパティに基づいて、オブジェクトの同等性を判断する方法を定義できます。
これは、Author
を実装する改良された IEquatable<Author>
クラスです。
<code class="language-csharp">public class Author : IEquatable<Author> { public string FirstName { get; set; } public string LastName { get; set; } public bool Equals(Author other) { if (other is null) return false; return FirstName == other.FirstName && LastName == other.LastName; } public override int GetHashCode() { return HashCode.Combine(FirstName, LastName); } }</code>
Equals()
メソッドをオーバーライドして GetHashCode()
を実装することにより、Distinct()
と Author
プロパティに基づいて重複した FirstName
オブジェクトを正しく識別し、削除するために必要なロジックを LastName
に提供します。 より堅牢なハッシュ コード生成のために HashCode.Combine
を使用することに注意してください。 これにより、Equals()
によって等しいとみなされるオブジェクトも同じハッシュ コードを生成するようになります。 このアプローチを使用すると、Distinct()
は名前に基づいて重複する作成者オブジェクトを正確に識別し、削除します。
以上がLINQ の Distinct メソッドがカスタム オブジェクトに対して非効率的であるのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。