ホームページ > バックエンド開発 > C++ > LINQ の Distinct メソッドがカスタム オブジェクトに対して非効率的であるのはなぜですか?それを修正するにはどうすればよいですか?

LINQ の Distinct メソッドがカスタム オブジェクトに対して非効率的であるのはなぜですか?それを修正するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-20 19:32:12
オリジナル
525 人が閲覧しました

Why is LINQ's Distinct Method Inefficient with Custom Objects, and How Can I Fix It?

カスタム オブジェクトに対する 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート