ホームページ > バックエンド開発 > C++ > LINQ の Distinct がカスタム オブジェクトで期待どおりに機能しないのはなぜですか?

LINQ の Distinct がカスタム オブジェクトで期待どおりに機能しないのはなぜですか?

Patricia Arquette
リリース: 2025-01-20 19:46:13
オリジナル
703 人が閲覧しました

Why Doesn't LINQ's Distinct Work as Expected with Custom Objects?

カスタム オブジェクトに関する LINQ の独自メソッドの制限を理解する

LINQ の Distinct() メソッドは、カスタム オブジェクトで使用すると予測不能になる可能性があります。 デフォルトの動作は、オブジェクトのプロパティの同等性ではなく、オブジェクト参照の同等性に依存します。 これは、同じプロパティ値を持つ 2 つの異なるオブジェクトが Distinct().

によって引き続き一意であるとみなされることを意味します。

この制限を克服するには、カスタム オブジェクトが等しいかどうかを判断する方法を定義する必要があります。一般的な解決策は、IEquatable<T> インターフェイスを実装することです。

カスタム オブジェクトの等価性のための 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 == null) return false;
        return FirstName == other.FirstName && LastName == other.LastName;
    }

    public override int GetHashCode()
    {
        unchecked // Overflow is fine, just wrap
        {
            int hash = (FirstName != null ? FirstName.GetHashCode() : 0);
            hash = (hash * 397) ^ (LastName != null ? LastName.GetHashCode() : 0);
            return hash;
        }
    }
}</code>
ログイン後にコピー

この実装は等価性を定義します:

  • Equals(Author other): このメソッドは、2 つの FirstName オブジェクトの LastName プロパティと Author プロパティを比較します。 両方のプロパティが等しい場合は true を返し、そうでない場合は false を返します。 堅牢性を高めるために Null チェックが含まれています。

  • GetHashCode(): このメソッドは、FirstName プロパティと LastName プロパティに基づいてハッシュ コードを生成します。 効率的な Distinct() 操作には、一貫したハッシュ コードが不可欠です。 unchecked キーワードと素数の乗算により、ハッシュ コードの分散が向上します。

Equals()GetHashCode() を正しく実装することで、Distinct() が同じプロパティ値を持つオブジェクトを同等であるとみなして、期待どおりの結果が得られます。

以上がLINQ の Distinct がカスタム オブジェクトで期待どおりに機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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