Share via


IStructuralEquatable.Equals(Object, IEqualityComparer) Metode

Definisi

Menentukan apakah objek secara struktural sama dengan instans saat ini.

public:
 bool Equals(System::Object ^ other, System::Collections::IEqualityComparer ^ comparer);
public bool Equals (object other, System.Collections.IEqualityComparer comparer);
public bool Equals (object? other, System.Collections.IEqualityComparer comparer);
abstract member Equals : obj * System.Collections.IEqualityComparer -> bool
Public Function Equals (other As Object, comparer As IEqualityComparer) As Boolean

Parameter

other
Object

Objek untuk dibandingkan dengan instans saat ini.

comparer
IEqualityComparer

Objek yang menentukan apakah instans saat ini dan other sama.

Mengembalikan

true jika dua objek sama; jika tidak, false.

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 IStructuralEquatable antarmuka. 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, 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

Metode ini Equals mendukung perbandingan struktural kustom dari objek array dan tuple. Metode ini pada gilirannya comparer memanggil metode objek IEqualityComparer.Equals untuk membandingkan elemen array individual atau komponen tuple, dimulai dengan elemen atau komponen pertama. Panggilan individual ke IEqualityComparer.Equals ujung dan IStructuralEquatable.Equals metode mengembalikan nilai baik ketika panggilan metode kembali false atau setelah semua elemen array atau komponen tuple telah dibandingkan.

Berlaku untuk

Lihat juga