Tuple<T1>.IStructuralEquatable.Equals(Object, IEqualityComparer) Tuple<T1>.IStructuralEquatable.Equals(Object, IEqualityComparer) Tuple<T1>.IStructuralEquatable.Equals(Object, IEqualityComparer) Method

定义

返回一个值,该值根据指定的比较方法指示当前的 Tuple<T1> 对象是否与指定对象相等。Returns a value that indicates whether the current Tuple<T1> object is equal to a specified object based on a specified comparison method.

 virtual bool System.Collections.IStructuralEquatable.Equals(System::Object ^ other, System::Collections::IEqualityComparer ^ comparer) = System::Collections::IStructuralEquatable::Equals;
bool IStructuralEquatable.Equals (object other, System.Collections.IEqualityComparer comparer);
Function Equals (other As Object, comparer As IEqualityComparer) As Boolean Implements IStructuralEquatable.Equals

参数

other
Object Object Object

与该实例进行比较的对象。The object to compare with this instance.

comparer
IEqualityComparer IEqualityComparer IEqualityComparer

一个对象,该对象定义用于评估两个对象是否相等的方法。An object that defines the method to use to evaluate whether the two objects are equal.

返回

如果当前实例等于指定对象,则为 true;否则为 falsetrue if the current instance is equal to the specified object; otherwise, false.

实现

示例

下面的示例定义IEqualityComparer考虑两个浮点值则大约为彼此相等 (即,如果一个值为其他.01%范围内) 的实现。The following example defines an IEqualityComparer implementation that considers two floating-point values to be equal if they are approximately equal to each other (that is, if one value is within .01 percent of the other).

using System;
using System.Collections;

public class Tuple1Comparer : IEqualityComparer
{
   new public bool Equals(object x, object y)
   {
      // Check if x is a floating point type. If x is, then y is.
      if (x is double | x is float)
      {   
         // Convert to Double values.
         double dblX = (double) x;
         double dblY = (double) y;
         if (Double.IsNaN(dblX) | Double.IsInfinity(dblX) |
             Double.IsNaN(dblY) | Double.IsInfinity(dblY)) 
            return dblX.Equals(dblY);   
         else
            return Math.Abs(dblX - dblY) <= dblX * .0001;
      }
      else
      {
         return x.Equals(y);
      }
   }
   
   public int GetHashCode(object obj)
   {
      return obj.GetHashCode();
   }
}

public class Example
{
   public static void Main()
   {
      var doubleTuple1 = Tuple.Create(12.3455);

      var doubleTuple2 = Tuple.Create(16.8912);
      var doubleTuple3 = Tuple.Create(12.3449599);

      // Compare first tuple with a Tuple<double> with a different value.
      TestEquality(doubleTuple1, doubleTuple2);
      //Compare first tuple with a Tuple<double> with the same value.
      TestEquality(doubleTuple1, doubleTuple3);
   }

   private static void TestEquality(Tuple<double> tuple, object obj)
   {
      Console.WriteLine("{0} = {1}: {2}", tuple.ToString(),
                                             obj.ToString(),
                                             ((IStructuralEquatable)tuple).Equals(obj, new Tuple1Comparer()));
   }
}
// The example displays the following output:
//       (12.3455) = (16.8912): False
//       (12.3455) = (12.3449599): True
Imports System.Collections

Public Class Tuple1Comparer : Implements IEqualityComparer
   Public Overloads Function Equals(x As Object, y As Object) As Boolean _
                   Implements IEqualityComparer.Equals
      ' Check if x is a floating point type. If x is, then y is.
      If TypeOf x Is Double Or TypeOf x Is Single Then   
         ' Convert to Double values.
         Dim dblX As Double = CDbl(x)
         Dim dblY As Double = CDbl(y)
         If Double.IsNan(dblX) Or Double.IsInfinity(dblX) Or _
            Double.IsNan(dblY) Or Double.IsInfinity(dblY) Then
            Return dblX.Equals(dblY)   
         Else
            Return Math.Abs(dblX - dblY) <= dblY * .0001
         End If
      Else
         Return x.Equals(y)
      End If                    
   End Function
   
   Public Overloads Function GetHashCode(obj As Object) As Integer _
                   Implements IEqualityComparer.GetHashCode
      Return obj.GetHashCode()
   End Function
End Class

Module Example
   Public Sub Main()
      Dim doubleTuple1 = Tuple.Create(12.3455)

      Dim doubleTuple2 = Tuple.Create(16.8912)
      Dim doubleTuple3 = Tuple.Create(12.3449599)

      ' Compare first tuple with a Tuple(Of Double) with a different value.
      TestEquality(doubleTuple1, doubleTuple2)
      ' Compare first tuple with a Tuple(Of Double) with the same value.
      TestEquality(doubleTuple1, doubleTuple3)
   End Sub

   Private Sub TestEquality(tuple As Tuple(Of Double), obj As Object)
      Try
         Console.WriteLine("{0} = {1}: {2}", tuple.ToString(),
                                             obj.ToString,
                                             DirectCAst(tuple, IStructuralEquatable).Equals(obj, New Tuple1Comparer()))
      
      Catch e As ArgumentException
         If obj.GetType.IsGenericType Then 
            If obj.GetType().Name = "Tuple`1" Then 
               Console.WriteLine("Cannot compare a Tuple(Of {0}) with a Tuple(Of {1}).", 
                              tuple.Item1.GetType().Name, obj.Item1.GetType().Name)
            Else
               Console.WriteLine("Cannot compare a {0} with a {1}.", tuple.GetType().Name, 
                                                                     obj.GetType().Name)
            End If
         Else
            Console.WriteLine("Cannot compare a {0} with a {1}.", tuple.GetType().Name,
                                                                  obj.GetType().Name)
         End If
      End Try
   End Sub
End Module
' The example displays the following output:
'       (12.3455) = (16.8912): False
'       (12.3455) = (12.3449599): True

注解

此成员是显式的接口成员实现。This member is an explicit interface member implementation. 它只能在 Tuple<T1> 实例强制转换为 IStructuralEquatable 接口时使用。It can be used only when the Tuple<T1> instance is cast to an IStructuralEquatable interface.

IEqualityComparer.Equals仅当调用实现other不是null,并可以成功地强制转换 (在 C#) 或 (在 Visual Basic) 转换为Tuple<T1>的单个组件是与当前实例相同的类型的对象。The IEqualityComparer.Equals implementation is called only if other is not null, and if it can be successfully cast (in C#) or converted (in Visual Basic) to a Tuple<T1> object whose single component is of the same type as the current instance. 该方法传递Item1当前实例的组件和Item1组成部分Tuple<T1>所表示对象other参数。The method is passed the Item1 component of the current instance and the Item1 component of the Tuple<T1> object represented by the other parameter.

适用于

另请参阅