ホームページ >バックエンド開発 >C++ >C# で複雑な入れ子になったオブジェクトを効率的に比較するにはどうすればよいですか?

C# で複雑な入れ子になったオブジェクトを効率的に比較するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-19 07:47:10104ブラウズ

How Can I Efficiently Compare Complex Nested Objects in C#?

複雑なオブジェクトを効率的に比較します

複数のサブオブジェクト層を含む複雑なオブジェクトを扱う場合、同等性の判断は時間のかかる作業になる可能性があります。 C# 4.0 でこのプロセスを最適化する最も効率的な方法は、すべてのカスタム型に IEquatable インターフェイスを実装することです。

IEquatable を実装する

各カスタム タイプ (ルート オブジェクト Object1 と Object2 を含む) に対して、IEquatable インターフェイスを実装して、カスタムの等価比較を提供します。これには、デフォルトの Equals メソッドと GetHashCode メソッドのオーバーライドが含まれます。

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 を実装する方が適切な場合があります。 GetHashCode は、ハッシュ コードに依存するコレクションに格納されているオブジェクトに対して一貫性があるように注意して使用してください。

以上がC# で複雑な入れ子になったオブジェクトを効率的に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。