IStructuralEquatable Arabirim
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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. |