複雑なオブジェクトを効率的に比較します
複数のサブオブジェクト層を含む複雑なオブジェクトを扱う場合、同等性の判断は時間のかかる作業になる可能性があります。 C# 4.0 でこのプロセスを最適化する最も効率的な方法は、すべてのカスタム型に IEquatable
IEquatable を実装する
各カスタム タイプ (ルート オブジェクト Object1 と Object2 を含む) に対して、IEquatable
Equals メソッドをオーバーライドします
Equals メソッドで、すべてのサブオブジェクトの Equals メソッドを再帰的に呼び出します。含まれるコレクションの場合は、SequenceEqual 拡張メソッドを使用して要素を効率的に比較します。 null 参照例外を避けるために、すべての参照が正しく処理されていることを確認してください。
値の型と参照の等価性
値の型の場合は、Equals メソッドを直接呼び出します。参照型の場合、まず ReferenceEquals を使用して参照の等価性がチェックされます。参照の等価性が確立されていない場合は、インスタンスのフィールドまたはプロパティが null かどうかを確認し、Equals メソッドの呼び出しに進みます。
例
個人、住所、市という 3 つのレベルのネストを使用した単純化された例を考えてみましょう。 Person クラスは IEquatable を実装し、再帰的な比較ロジックを備えています:
<code class="language-csharp">public class Person : IEquatable<Person> { public int Age { get; set; } public string FirstName { get; set; } public Address Address { get; set; } public bool Equals(Person other) { return Age.Equals(other.Age) && FirstName?.Equals(other.FirstName) == true && Address?.Equals(other.Address) == true; } }</code>
Address クラスと City クラスにも同様の実装を提供できます。 例外を回避するために、? 演算子を使用して null 参照を処理することに注意してください。
更新: 識別と同等
提供されるソリューションは等価比較を前提としていることに注意してください。ただし、可変型の場合は、等価性ではなく同一性に基づいて IEquality
以上がC# で複雑な入れ子になったオブジェクトを効率的に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。