다음을 통해 공유


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

두 개체가 같은지 여부를 평가하는 데 사용할 방법을 정의하는 개체입니다.

반환

Boolean

현재 인스턴스가 지정된 개체와 같으면 true이고, 그렇지 않으면 false입니다.

구현

예제

다음 예제에서는 인터페이스를 Item2Comparer 구현하는 클래스를 IEqualityComparer 정의하고 개체가 같은지 평가하는 방식을 Tuple<T1,T2> 변경합니다. 메서드는 두 Tuple<T1,T2> 개체의 속성 값을 전달할 Item1 때 항상 반환 true 하고 메서드를 IStructuralEquatable.Equals 호출하여 해당 Item2 속성 값을 평가합니다. 결과적으로 메서드는 속성 값에 따라 같음을 테스트합니다 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 비교할 IEqualityComparer.Equals 개체의 Tuple<T1,T2> 값을 전달합니다. 이 메서드 호출이 반환true되면 메서드가 다시 호출되고 두 Tuple<T1,T2> 개체의 값이 전달됩니다Item2.

적용 대상

추가 정보