IStructuralEquatable Antarmuka
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menentukan metode untuk mendukung perbandingan objek untuk kesetaraan struktural.
public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
- Turunan
Contoh
Perbandingan kesetaraan default, EqualityComparer<Object>.Default.Equals
, menganggap dua NaN
nilai sama. Namun, dalam beberapa kasus, Anda mungkin ingin perbandingan nilai untuk kesetaraan NaN
kembali false
, yang menunjukkan bahwa nilai tidak dapat dibandingkan. Contoh berikut mendefinisikan NanComparer
kelas yang mengimplementasikan IEqualityComparer antarmuka. Ini digunakan oleh contoh ketiga sebagai argumen untuk Equals(Object, IEqualityComparer) metode IStructuralEquatable antarmuka yang diterapkan tuple. Ini membandingkan dua Double atau dua Single nilai dengan menggunakan operator kesetaraan. Ini meneruskan nilai dari jenis lain ke perbandingan kesetaraan default.
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
Contoh berikut membuat dua objek 3 tuple yang identik yang komponennya terdiri dari tiga Double nilai. Nilai komponen kedua adalah Double.NaN. Contohnya kemudian memanggil Tuple<T1,T2,T3>.Equals metode , dan memanggil IStructuralEquatable.Equals metode tiga kali. Pertama kali, ia melewati perbandingan kesetaraan default yang dikembalikan oleh EqualityComparer<T>.Default properti . Kedua kalinya, ia melewati perbandingan kesetaraan default yang dikembalikan oleh StructuralComparisons.StructuralEqualityComparer properti . Ketiga kalinya, ia melewati objek kustom NanComparer
. Seperti yang ditunjukkan oleh output dari contoh, tiga panggilan metode pertama mengembalikan true
, sedangkan panggilan keempat mengembalikan 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
Keterangan
Kesetaraan struktural berarti bahwa dua objek sama karena memiliki nilai yang sama. Ini berbeda dari kesetaraan referensi, yang menunjukkan bahwa dua referensi objek sama karena mereferensikan objek fisik yang sama. Antarmuka memungkinkan IStructuralEquatable Anda menerapkan perbandingan yang disesuaikan untuk memeriksa kesetaraan struktural objek koleksi. Artinya, Anda dapat membuat definisi Anda sendiri tentang kesetaraan struktural dan menentukan bahwa definisi ini digunakan dengan jenis koleksi yang menerima IStructuralEquatable antarmuka. Antarmuka memiliki dua anggota: Equals, yang menguji kesetaraan dengan menggunakan implementasi tertentu IEqualityComparer , dan GetHashCode, yang mengembalikan kode hash yang identik untuk objek yang sama.
Catatan
Antarmuka IStructuralEquatable hanya mendukung perbandingan kustom untuk kesetaraan struktural. Antarmuka IStructuralComparable mendukung perbandingan struktural kustom untuk pengurutan dan pengurutan.
.NET Framework juga menyediakan perbandingan kesetaraan default, yang dikembalikan oleh EqualityComparer<T>.Default properti dan StructuralComparisons.StructuralEqualityComparer . Untuk informasi selengkapnya, lihat contohnya.
Kelas tuple generik (Tuple<T1>, , Tuple<T1,T2,T3>Tuple<T1,T2>, dan sebagainya) dan Array kelas menyediakan implementasi eksplisit antarmukaIStructuralEquatable. Dengan mentransmisikan (dalam C#) atau mengonversi (di Visual Basic) instans array atau tuple saat ini ke IStructuralEquatable nilai antarmuka dan menyediakan implementasi Anda IEqualityComparer sebagai argumen ke Equals metode , Anda dapat menentukan perbandingan kesetaraan kustom untuk array atau koleksi.
Metode
Equals(Object, IEqualityComparer) |
Menentukan apakah objek secara struktural sama dengan instans saat ini. |
GetHashCode(IEqualityComparer) |
Mengembalikan kode hash untuk instans saat ini. |