IStructuralEquatable.Equals(Object, IEqualityComparer) Metod

Definition

Avgör om ett objekt är strukturellt lika med den aktuella instansen.

public:
 bool Equals(System::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

Parametrar

other
Object

Det objekt som ska jämföras med den aktuella instansen.

comparer
IEqualityComparer

Ett objekt som avgör om den aktuella instansen och other är lika med.

Returer

trueom de två objekten är lika; annars . false

Exempel

Standardjämförlikningsjämföraren, EqualityComparer<Object>.Default.Equals, anser att två NaN värden är lika med. Men i vissa fall kanske du vill att jämförelsen av NaN värden för likhet ska returnera false, vilket indikerar att värdena inte kan jämföras. I följande exempel definieras en NanComparer klass som implementerar IStructuralEquatable gränssnittet. Den jämför två Double eller två Single värden med hjälp av likhetsoperatorn. Den skickar värden av någon annan typ till standardjämförlikningsjämföraren.

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

I följande exempel skapas två identiska 3-tuppeln-objekt vars komponenter består av tre Double värden. Värdet för den andra komponenten är Double.NaN. Exemplet anropar Tuple<T1,T2,T3>.Equals sedan metoden och anropar IStructuralEquatable.Equals metoden tre gånger. Första gången skickas standardjämlikhetsjämförlikningsjämföraren som returneras av EqualityComparer<T>.Default egenskapen. Den andra gången skickas standardjämlikhetsjämföraren som returneras av StructuralComparisons.StructuralEqualityComparer egenskapen. Den tredje gången skickas det anpassade NanComparer objektet. Som utdata från exemplet visar returnerar truede tre första metodanropen , medan det fjärde anropet returnerar 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

Kommentarer

Metoden Equals stöder anpassad strukturell jämförelse av matris- och tuppelns objekt. Den här metoden anropar comparer i sin tur objektets IEqualityComparer.Equals metod för att jämföra enskilda matriselement eller tuppelkomponenter, med början med det första elementet eller komponenten. De enskilda anropen IStructuralEquatable.Equals till slutet och metoden returnerar ett värde antingen när ett metodanrop returnerar false eller efter att IEqualityComparer.Equals alla matriselement eller tuppelns komponenter har jämförts.

Gäller för

Se även