次の方法で共有


Tuple<T1,T2>.IStructuralEquatable.Equals メソッド

定義

指定された比較メソッドに基づいて、現在の Tuple<T1,T2> オブジェクトが指定したオブジェクトと等しいかどうかを示す値を返します。

 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);
abstract member System.Collections.IStructuralEquatable.Equals : obj * System.Collections.IEqualityComparer -> bool
override this.System.Collections.IStructuralEquatable.Equals : obj * System.Collections.IEqualityComparer -> bool
Function Equals (other As Object, comparer As IEqualityComparer) As Boolean Implements IStructuralEquatable.Equals

パラメーター

other
Object

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

comparer
IEqualityComparer

2 つのオブジェクトが等しいかどうかの評価に使用するメソッドを定義するオブジェクト。

戻り値

Boolean

現在のインスタンスが指定したオブジェクトと等しい場合は true。それ以外の場合は false

実装

次の例では、インターフェイスを Item2Comparer 実装 IEqualityComparer し、オブジェクトが等しいかどうかを評価する方法を変更する Tuple<T1,T2> クラスを定義します。 メソッドは、2 つのオブジェクトのtrueプロパティ値が渡されるとItem1常に返され、メソッドをIStructuralEquatable.Equals呼び出してプロパティ値をItem2評価Tuple<T1,T2>します。 その結果、メソッドはプロパティの値のみに基づいて等価性を Item2 テストします。 出力は、ランナーの Tuple<T1,T2> 名前と実行された距離を記録するオブジェクトのデータ セットの結果を示しています。

using System;
using System.Collections;

public class Item2Comparer<T1, T2> : IEqualityComparer
{
   new public bool Equals(object x, object y)
   {
      // Return true for all values of Item1.
      if (x is T1)
      //if (typeof(x) is string) 
         return true;
      else
         return x.Equals(y);
   }
   
   public int GetHashCode(object obj)
   {
      if (obj is T1)
         return ((T1) obj).GetHashCode();
      else
         return ((T2) obj).GetHashCode();
   }                
}

public class Example
{
   public static void Main()
   {
      Tuple<string, double>[] distancesWalked = {
                        Tuple.Create("Jan", Double.NaN), 
                        Tuple.Create("Joe", Double.NaN), 
                        Tuple.Create("Adam", 1.36), 
                        Tuple.Create("Selena", 2.01),
                        Tuple.Create("Jake", 1.36) };
      for (int ctr = 0; ctr < distancesWalked.Length; ctr++)
      {
         Tuple<string, double> distanceWalked = distancesWalked[ctr];
         for (int ctr2 = ctr + 1; ctr2 < distancesWalked.Length; ctr2++)
         {
            Console.WriteLine("{0} = {1}: {2}", distanceWalked, 
                              distancesWalked[ctr2], 
                              ((IStructuralEquatable)distanceWalked).Equals(distancesWalked[ctr2], 
                                                    new Item2Comparer<string, double>()));
         }
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//       (Jan, NaN) = (Joe, NaN): True
//       (Jan, NaN) = (Adam, 1.36): False
//       (Jan, NaN) = (Selena, 2.01): False
//       (Jan, NaN) = (Jake, 1.36): False
//       
//       (Joe, NaN) = (Adam, 1.36): False
//       (Joe, NaN) = (Selena, 2.01): False
//       (Joe, NaN) = (Jake, 1.36): False
//       
//       (Adam, 1.36) = (Selena, 2.01): False
//       (Adam, 1.36) = (Jake, 1.36): True
//       
//       (Selena, 2.01) = (Jake, 1.36): False
open System
open System.Collections

type Item2Comparer<'T1, 'T2 when 'T1: equality and 'T2: equality>() = 
    interface IEqualityComparer with    
        member _.GetHashCode(obj) =
            match obj with
            | :? 'T1 as obj->
                obj.GetHashCode()
            | _ ->
                (obj :?> 'T2).GetHashCode()

        member _.Equals(x, y) =
            // Return true for all values of Item1.
            match x with
            | :? 'T1 ->
                true
            | _ ->
                x.Equals y

let distancesWalked =
    [| Tuple.Create("Jan", Double.NaN) 
       Tuple.Create("Joe", Double.NaN) 
       Tuple.Create("Adam", 1.36)
       Tuple.Create("Selena", 2.01)
       Tuple.Create("Jake", 1.36) |]

for ctr = 0 to distancesWalked.Length - 1 do
    let distanceWalked = distancesWalked[ctr]
    for ctr2 = ctr + 1 to distancesWalked.Length - 1 do
        printfn $"{distanceWalked} = {distancesWalked[ctr2]}: {(distanceWalked :> IStructuralEquatable).Equals(distancesWalked[ctr2], Item2Comparer<string, double>())}"
    printfn ""
// The example displays the following output:
//       (Jan, NaN) = (Joe, NaN): True
//       (Jan, NaN) = (Adam, 1.36): False
//       (Jan, NaN) = (Selena, 2.01): False
//       (Jan, NaN) = (Jake, 1.36): False
//       
//       (Joe, NaN) = (Adam, 1.36): False
//       (Joe, NaN) = (Selena, 2.01): False
//       (Joe, NaN) = (Jake, 1.36): False
//       
//       (Adam, 1.36) = (Selena, 2.01): False
//       (Adam, 1.36) = (Jake, 1.36): True
//       
//       (Selena, 2.01) = (Jake, 1.36): False
Imports System.Collections

Public Class Item2Comparer(Of T1, T2) : Implements IEqualityComparer
   
   Public Overloads Function Equals(x As Object, y As Object) As Boolean _
                   Implements IEqualityComparer.Equals
      ' Return true for all values of Item1.
      If TypeOf x Is T1 Then
         Return True
      Else
         Return x.Equals(y)
      End If
   End Function
   
   Public Overloads Function GetHashCode(obj As Object) As Integer _
                    Implements IEqualityComparer.GetHashCode
      If TypeOf obj Is T1 Then
         Return CType(obj, T1).GetHashCode()
      Else
         Return CType(obj, T2).GetHashCode()
      End If   
   End Function                
End Class

Module Example
   Public Sub Main()
      Dim distancesWalked() = {
                        Tuple.Create("Jan", Double.NaN), 
                        Tuple.Create("Joe", Double.NaN), 
                        Tuple.Create("Adam", 1.36), 
                        Tuple.Create("Selena", 2.01),
                        Tuple.Create("Jake", 1.36) }
      For ctr As Integer = 0 To distancesWalked.Length - 1
         Dim distanceWalked As Tuple(Of String, Double) = distancesWalked(ctr)
         For ctr2 As Integer = ctr + 1 To distancesWalked.Length - 1
            Console.WriteLine("{0} = {1}: {2}", distanceWalked, 
                              distancesWalked(ctr2), 
                              DirectCast(distanceWalked, IStructuralEquatable).Equals(distancesWalked(ctr2), 
                                                    new Item2Comparer(Of String, Double)))
         Next
         Console.WriteLine()
      Next                     
   End Sub
End Module
' The example displays the following output:
'       (Jan, NaN) = (Joe, NaN): True
'       (Jan, NaN) = (Adam, 1.36): False
'       (Jan, NaN) = (Selena, 2.01): False
'       (Jan, NaN) = (Jake, 1.36): False
'       
'       (Joe, NaN) = (Adam, 1.36): False
'       (Joe, NaN) = (Selena, 2.01): False
'       (Joe, NaN) = (Jake, 1.36): False
'       
'       (Adam, 1.36) = (Selena, 2.01): False
'       (Adam, 1.36) = (Jake, 1.36): True
'       
'       (Selena, 2.01) = (Jake, 1.36): False

注釈

このメンバーは、明示的なインターフェイス メンバーの実装です。 これは、Tuple<T1,T2> のインスタンスが IStructuralEquatable インターフェイスにキャストされる場合のみ、使用できます。

実装がIStructuralEquatable.Equals呼び出されるのは、そうでないnull場合、およびコンポーネントが現在のインスタンスと同じ型のオブジェクトに正常にキャスト (C#) または変換 (Visual Basic) Tuple<T1,T2> できる場合otherのみです。 メソッドは IStructuralEquatable.Equals まず、実装と Item1 比較するオブジェクトの Tuple<T1,T2> 値を IEqualityComparer.Equals 渡します。 このメソッド呼び出しが返されたtrue場合は、メソッドが再度呼び出され、2 つのTuple<T1,T2>オブジェクトの値が渡されますItem2

適用対象

こちらもご覧ください