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