IStructuralEquatable Antarmuka

Definisi

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.

Berlaku untuk

Lihat juga