Прочитать на английском

Поделиться через


IEquatable<T>.Equals(T) Метод

Определение

Указывает, равен ли текущий объект другому объекту того же типа.

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

Параметры

other
T

Объект, который требуется сравнить с данным объектом.

Возвращаемое значение

Boolean

true, если текущий объект эквивалентен параметру other, в противном случае — false.

Примеры

В следующем примере показана частичная реализация класса, реализующего Person IEquatable<T> и имеющего два свойства, LastName и SSN. Метод Equals возвращает значение True , если SSN свойство двух Person объектов идентично; в противном случае возвращается Falseзначение .

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 , как показано в следующем примере.

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) вызывается в следующих случаях:

  • При вызове Equals метода и other аргументе является строго типизированным объектом типа T. (Если other он не имеет типа T, вызывается базовый Object.Equals(Object) метод. Из двух методов IEquatable<T>.Equals обеспечивает немного лучшую производительность.)

  • При вызове методов поиска ряда универсальных объектов коллекции. Некоторые из этих типов и их методы включают в себя следующее:

Другими словами, для обработки возможности хранения объектов класса в массиве или универсальном объекте коллекции рекомендуется реализовать IEquatable<T> так, чтобы объект можно было легко идентифицировать и манипулировать им.

При реализации Equals метода определите равенство соответствующим образом для типа, указанного аргументом универсального типа. Например, если аргумент типа имеет значение Int32, определите равенство соответствующим образом для сравнения двух 32-разрядных целых чисел со знаком.

Примечания для тех, кто реализует этот метод

При реализации Equals(T)следует также переопределить реализации Equals(Object) базового класса, GetHashCode() чтобы их поведение соответствовало Equals(T) его поведению. При переопределении Equals(Object)реализация переопределения также вызывается в вызовах статического Equals(System.Object, System.Object) метода класса. Кроме того, следует перегружать op_Equality операторы и op_Inequality операторы. Это гарантирует, что все тесты на равенство возвращают согласованные результаты, как показано в примере.

Применяется к

Продукт Версии
.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