次の方法で共有


IStructuralEquatable.Equals(Object, IEqualityComparer) メソッド

定義

オブジェクトが現在のインスタンスと構造的に等しいかどうかを判断します。

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

パラメーター

other
Object

現在のインスタンスと比較するオブジェクト。

comparer
IEqualityComparer

現在のインスタンスと other が等しいかどうかを判断するオブジェクト。

返品

true 2 つのオブジェクトが等しい場合。それ以外の場合は false

既定の等値比較子 ( EqualityComparer<Object>.Default.Equals) では、2 つの NaN 値が等しいと見なされます。 ただし、場合によっては、 NaN 値を比較して等しいかどうかを比較して falseを返すことができます。これは、値を比較できないことを示します。 次の例では、 NanComparer インターフェイスを実装する IStructuralEquatable クラスを定義しています。 等値演算子を使用して、2 つの Double または 2 つの Single 値を比較します。 他の型の値を既定の等値比較子に渡します。

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

次の例では、コンポーネントが 3 つの Double 値で構成される 2 つの同一の 3 タプル オブジェクトを作成します。 2 番目のコンポーネントの値は Double.NaN。 次に、 Tuple<T1,T2,T3>.Equals メソッドを呼び出し、 IStructuralEquatable.Equals メソッドを 3 回呼び出します。 初めて、 EqualityComparer<T>.Default プロパティによって返される既定の等値比較子を渡します。 2 回目は、 StructuralComparisons.StructuralEqualityComparer プロパティによって返される既定の等値比較子を渡します。 3 回目は、カスタム NanComparer オブジェクトを渡します。 この例の出力に示すように、最初の 3 つのメソッド呼び出しでは trueが返されますが、4 番目の呼び出しでは 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

注釈

Equals メソッドは、配列オブジェクトとタプル オブジェクトのカスタム構造比較をサポートします。 このメソッドは、 comparer オブジェクトの IEqualityComparer.Equals メソッドを呼び出して、最初の要素またはコンポーネントから始まる個々の配列要素またはタプル コンポーネントを比較します。 IEqualityComparer.Equals終了メソッドとIStructuralEquatable.Equals メソッドの個々の呼び出しは、メソッド呼び出しがfalseを返すとき、またはすべての配列要素またはタプル コンポーネントが比較された後に値を返します。

適用対象

こちらもご覧ください