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ı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.Equals
iki NaN
değeri eşit olarak kabul eder. Ancak bazı durumlarda, eşitlik değerlerinin karşılaştırmasının döndürerek false
değ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. |