IStructuralEquatable Arabirim

Tanım

Yapısal eşitlik için nesnelerin karşılaştırılmasını destekleyen yöntemleri 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 döndürerek falsedeğerlerin NaN karşılaştırılamayacağını göstermesini isteyebilirsiniz. Aşağıdaki örnek, arabirimini uygulayan IEqualityComparer bir NanComparer sınıfı tanımlar. Üçüncü örnek tarafından, tanımlama listelerinin uyguladığı arabirimin Equals(Object, IEqualityComparer) yöntemine IStructuralEquatable bir 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ürdeki değerleri 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, eşit değerlere sahip oldukları için iki nesnenin eşit olduğu anlamına gelir. 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. arabirimi, 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: Equals, belirtilen IEqualityComparer bir uygulamayı kullanarak eşitliği test eder ve GetHashCodeeşit olan nesneler için aynı karma kodları döndürür.

Not

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. Bir dizinin veya tanımlama grubunun 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ı IEqualityComparer yöntemine Equals bağımsız değişken olarak sağlayarak, dizi veya koleksiyon için özel bir eşitlik karşılaştırması tanımlayabilirsiniz.

Yöntemler

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.