英語で読む

次の方法で共有


IEquatable<T>.Equals(T) メソッド

定義

現在のオブジェクトが、同じ型の別のオブジェクトと等しいかどうかを示します。

C#
public bool Equals (T other);
C#
public bool Equals (T? other);

パラメーター

other
T

このオブジェクトと比較するオブジェクト。

戻り値

Boolean

現在のオブジェクトが other パラメーターと等しい場合は true、それ以外の場合は false です。

次の例は、2 つのプロパティをPerson実装し、持つクラスの部分的な実装IEquatable<T>を示していますSSNLastName このメソッドはEquals、2 つのPersonオブジェクトのプロパティが同一の場合SSNは返Trueします。それ以外の場合は、値を返しますFalse

C#
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Person : IEquatable<Person>
{
   private string uniqueSsn;
   private string lName;

   public Person(string lastName, string ssn)
   {
      if (Regex.IsMatch(ssn, @"\d{9}"))
        uniqueSsn = $"{ssn.Substring(0, 3)}-{ssn.Substring(3, 2)}-{ssn.Substring(5, 4)}";
      else if (Regex.IsMatch(ssn, @"\d{3}-\d{2}-\d{4}"))
         uniqueSsn = ssn;
      else
         throw new FormatException("The social security number has an invalid format.");

      this.LastName = lastName;
   }

   public string SSN
   {
      get { return this.uniqueSsn; }
   }

   public string LastName
   {
      get { return this.lName; }
      set {
         if (String.IsNullOrEmpty(value))
            throw new ArgumentException("The last name cannot be null or empty.");
         else
            this.lName = value;
      }
   }

   public bool Equals(Person other)
   {
      if (other == null)
         return false;

      if (this.uniqueSsn == other.uniqueSsn)
         return true;
      else
         return false;
   }

   public override bool Equals(Object obj)
   {
      if (obj == null)
         return false;

      Person personObj = obj as Person;
      if (personObj == null)
         return false;
      else
         return Equals(personObj);
   }

   public override int GetHashCode()
   {
      return this.SSN.GetHashCode();
   }

   public static bool operator == (Person person1, Person person2)
   {
      if (((object)person1) == null || ((object)person2) == null)
         return Object.Equals(person1, person2);

      return person1.Equals(person2);
   }

   public static bool operator != (Person person1, Person person2)
   {
      if (((object)person1) == null || ((object)person2) == null)
         return ! Object.Equals(person1, person2);

      return ! (person1.Equals(person2));
   }
}

Person 次の例に示すように、オブジェクトを List<T> オブジェクトに格納し、メソッドで Contains 識別できます。

C#
public class TestIEquatable
{
   public static void Main()
   {
      // Create a Person object for each job applicant.
      Person applicant1 = new Person("Jones", "099-29-4999");
      Person applicant2 = new Person("Jones", "199-29-3999");
      Person applicant3 = new Person("Jones", "299-49-6999");

      // Add applicants to a List object.
      List<Person> applicants = new List<Person>();
      applicants.Add(applicant1);
      applicants.Add(applicant2);
      applicants.Add(applicant3);

       // Create a Person object for the final candidate.
       Person candidate = new Person("Jones", "199-29-3999");
       if (applicants.Contains(candidate))
          Console.WriteLine("Found {0} (SSN {1}).",
                             candidate.LastName, candidate.SSN);
      else
         Console.WriteLine("Applicant {0} not found.", candidate.SSN);

      // Call the shared inherited Equals(Object, Object) method.
      // It will in turn call the IEquatable(Of T).Equals implementation.
      Console.WriteLine("{0}({1}) already on file: {2}.",
                        applicant2.LastName,
                        applicant2.SSN,
                        Person.Equals(applicant2, candidate));
   }
}
// The example displays the following output:
//       Found Jones (SSN 199-29-3999).
//       Jones(199-29-3999) already on file: True.

注釈

メソッドの Equals 実装は、現在のオブジェクトと同じ型 Tの別のオブジェクトと等しいかどうかをテストすることを目的としています。 このメソッドは Equals(T) 、次の状況で呼び出されます。

つまり、クラスのオブジェクトが配列またはジェネリック コレクション オブジェクトに格納される可能性を処理するには、オブジェクトを簡単に識別して操作できるように実装 IEquatable<T> することをお勧めします。

メソッドを Equals 実装する場合は、ジェネリック型引数で指定された型に対して等価性を適切に定義します。 たとえば、型引数が指定されている場合は Int32、2 つの 32 ビット符号付き整数の比較に対して等値を適切に定義します。

注意 (実装者)

実装Equals(T)する場合は、基底クラスのEquals(Object)実装をオーバーライドし、その動作がメソッドのEquals(T)動作とGetHashCode()一致するようにする必要もあります。 オーバーライド Equals(Object)する場合、オーバーライドされた実装は、クラスの静的 Equals(System.Object, System.Object) メソッドの呼び出しでも呼び出されます。 さらに、and op_Inequality 演算子をオーバーロードするop_Equality必要があります。 これにより、等しいかどうかを確認するすべてのテストで一貫した結果が返されることが保証されます。この例で示します。

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0