Aracılığıyla paylaş


IStructuralEquatable Arabirim

Tanım

Yapısal eşitlik için nesnelerin karşılaştırmasını desteklemek için yöntemler tanımlar.

public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
Türetilmiş

Örnekler

Varsayılan eşitlik karşılaştırıcısı, EqualityComparer<Object>.Default.Equalsiki NaN değeri eşit olarak kabul eder. Ancak bazı durumlarda, eşitlik değerlerinin karşılaştırmasının NaN döndürülmesini falseisteyebilirsiniz. Bu da değerlerin karşılaştırılamayacağını gösterir. Aşağıdaki örnek, NanComparer sınıfını ve IEqualityComparer arabirimini uygulayan bir sınıfı tanımlar. Üçüncü örnek tarafından tanımlama listelerinin uyguladığı arabirimin IStructuralEquatable yöntemine Equals(Object, IEqualityComparer) bağımsız değişken olarak kullanılır. İki veya iki Single değeri eşitlik işlecini kullanarak karşılaştırırDouble. Başka herhangi bir türün değerlerini varsayılan eşitlik karşılaştırıcısına geçirir.

using System;
using System.Collections;
using System.Collections.Generic;

public class NanComparer : IEqualityComparer
{
   public new bool Equals(object x, object y)
   {
      if (x is float)
         return (float) x == (float) y;
      else if (x is double)
         return (double) x == (double) y;
      else
         return EqualityComparer<object>.Default.Equals(x, y);
   }

   public int GetHashCode(object obj)
   {
      return EqualityComparer<object>.Default.GetHashCode(obj);
   }
}
Imports System.Collections
Imports System.Collections.Generic

Public Class NanComparer : Implements IEqualityComparer
   Public Overloads Function Equals(x As Object, y As Object) As Boolean _
          Implements IEqualityComparer.Equals
      If TypeOf x Is Single Then
         Return CSng(x) = CSng(y)
      ElseIf TypeOf x Is Double Then
         Return CDbl(x) = CDbl(y)
      Else
         Return EqualityComparer(Of Object).Default.Equals(x, y)
      End If
   End Function
   
   Public Overloads Function GetHashCode(obj As Object) As Integer _
          Implements IEqualityComparer.GetHashCode
      Return EqualityComparer(Of Object).Default.GetHashCode(obj)
   End Function
End Class

Aşağıdaki örnek, bileşenleri üç Double değerden oluşan iki özdeş 3 tanımlama grubu nesnesi oluşturur. İkinci bileşenin değeri şeklindedir Double.NaN. Örnek daha sonra yöntemini çağırır Tuple<T1,T2,T3>.Equals ve yöntemini üç kez çağırır IStructuralEquatable.Equals . İlk kez, özelliği tarafından döndürülen varsayılan eşitlik karşılaştırıcısını EqualityComparer<T>.Default geçirir. İkinci kez, özelliği tarafından döndürülen varsayılan eşitlik karşılaştırıcısını StructuralComparisons.StructuralEqualityComparer geçirir. Üçüncü kez özel nesneyi geçirir NanComparer . Örnekteki çıktıda gösterildiği gibi, ilk üç yöntem çağrısı döndürürken true, dördüncü çağrı döndürür false.

public class Example
{
   public static void Main()
   {
      var t1 = Tuple.Create(12.3, Double.NaN, 16.4);
      var t2 = Tuple.Create(12.3, Double.NaN, 16.4);

      // Call default Equals method.
      Console.WriteLine(t1.Equals(t2));

      IStructuralEquatable equ = t1;
      // Call IStructuralEquatable.Equals using default comparer.
      Console.WriteLine(equ.Equals(t2, EqualityComparer<object>.Default));

      // Call IStructuralEquatable.Equals using
      // StructuralComparisons.StructuralEqualityComparer.
      Console.WriteLine(equ.Equals(t2,
                        StructuralComparisons.StructuralEqualityComparer));

      // Call IStructuralEquatable.Equals using custom comparer.
      Console.WriteLine(equ.Equals(t2, new NanComparer()));
   }
}
// The example displays the following output:
//       True
//       True
//       True
//       False
Module Example
   Public Sub Main()
      Dim t1 = Tuple.Create(12.3, Double.NaN, 16.4)
      Dim t2 = Tuple.Create(12.3, Double.NaN, 16.4)
      
      ' Call default Equals method.
      Console.WriteLine(t1.Equals(t2))
      
      Dim equ As IStructuralEquatable = t1
      ' Call IStructuralEquatable.Equals using default comparer.
      Console.WriteLine(equ.Equals(t2, EqualityComparer(Of Object).Default))
      
      ' Call IStructuralEquatable.Equals using 
      ' StructuralComparisons.StructuralEqualityComparer.
      Console.WriteLine(equ.Equals(t2, 
                        StructuralComparisons.StructuralEqualityComparer))
      
      ' Call IStructuralEquatable.Equals using custom comparer.
      Console.WriteLine(equ.Equals(t2, New NanComparer))
   End Sub
End Module
' The example displays the following output:
'       True
'       True
'       True
'       False

Açıklamalar

Yapısal eşitlik, iki nesnenin eşit olduğu anlamına gelir çünkü eşit değerlere sahiptirler. Aynı fiziksel nesneye başvurdıkları için iki nesne başvurusunun eşit olduğunu gösteren başvuru eşitliğinden farklıdır. Arabirim, IStructuralEquatable koleksiyon nesnelerinin yapısal eşitliğini denetlemek için özelleştirilmiş karşılaştırmalar uygulamanıza olanak tanır. Başka bir ifadeyle, kendi yapısal eşitlik tanımınızı oluşturabilir ve bu tanımın arabirimi kabul IStructuralEquatable eden bir koleksiyon türüyle kullanılacağını belirtebilirsiniz. Arabirimin iki üyesi vardır: Equalsbelirtilen IEqualityComparer bir uygulama kullanarak eşitliği test eden ve GetHashCodeeşit nesneler için aynı karma kodları döndüren .

Uyarı

Arabirim yalnızca IStructuralEquatable yapısal eşitlik için özel karşılaştırmaları destekler. Arabirim, IStructuralComparable sıralama ve sıralama için özel yapısal karşılaştırmaları destekler.

.NET Framework, ve StructuralComparisons.StructuralEqualityComparer özellikleri tarafından EqualityComparer<T>.Default döndürülen varsayılan eşitlik karşılaştırıcılarını da sağlar. Daha fazla bilgi için örne bakın.

Genel tanımlama grubu sınıfları (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>vb.) ve Array sınıfı arabiriminin IStructuralEquatable açık uygulamalarını sağlar. Dizi veya tanımlama kümesinin geçerli örneğini bir arabirim değerine dönüştürerek (C# dilinde) veya IStructuralEquatable dönüştürerek (Visual Basic'te) ve uygulamanızı yöntemin Equals bağımsız değişkeni olarak sağlayarakIEqualityComparer, dizi veya koleksiyon için özel bir eşitlik karşılaştırması tanımlayabilirsiniz.

Yöntemler

Name Description
Equals(Object, IEqualityComparer)

Bir nesnenin yapısal olarak geçerli örneğe eşit olup olmadığını belirler.

GetHashCode(IEqualityComparer)

Geçerli örnek için bir karma kodu döndürür.

Şunlara uygulanır

Ayrıca bkz.