Tuple<T1,T2,T3>.IStructuralEquatable.Equals 메서드

정의

지정된 비교 메서드를 기반으로 현재 Tuple<T1,T2,T3> 개체가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.

 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,T3> 변경합니다. 메서드는 두 Tuple<T1,T2,T3> 개체의 속성 값을 전달할 Item1 때 항상 반환 true 하고 메서드를 Tuple<T1,T2,T3>.IStructuralEquatable.Equals 호출하여 해당 Item2 속성 값을 평가합니다. 이 메서드 호출이 반환 true되면 해당 Item3 속성 값이 항상 반환 true되는 메서드에 전달됩니다. 결과적으로 메서드는 속성 값에 따라 같음을 테스트합니다 Item2 . 출력은 이름, 평균 시험 점수 및 클래스의 Tuple<T1,T2,T3> 학생 테스트 수를 기록하는 개체의 데이터 집합에 대한 결과를 보여 줍니다.

using System;
using System.Collections;

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

public class Example
{
   public static void Main()
   {
      Tuple<string, double, int>[] scores = 
           { Tuple.Create("Ed", 78.8, 8),
             Tuple.Create("Abbey", 92.1, 9), 
             Tuple.Create("Jim", 71.2, 9),
             Tuple.Create("Sam", 91.7, 8), 
             Tuple.Create("Sandy", 71.2, 5),
             Tuple.Create("Penelope", 82.9, 8),
             Tuple.Create("Serena", 71.2, 9),
             Tuple.Create("Judith", 84.3, 9) };

      for (int ctr = 0; ctr < scores.Length; ctr++)
      {
         IStructuralEquatable score = scores[ctr];
         for (int ctr2 = ctr + 1; ctr2 < scores.Length; ctr2++)
         {
            Console.WriteLine("{0} = {1}: {2}", score, 
                              scores[ctr2], 
                              score.Equals(scores[ctr2], 
                                           new Item2Comparer<string, double, int>()));
         }
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//      (Ed, 78.8, 8) = (Abbey, 92.1, 9): False
//      (Ed, 78.8, 8) = (Jim, 71.2, 9): False
//      (Ed, 78.8, 8) = (Sam, 91.7, 8): False
//      (Ed, 78.8, 8) = (Sandy, 71.2, 5): False
//      (Ed, 78.8, 8) = (Penelope, 82.9, 8): False
//      (Ed, 78.8, 8) = (Serena, 71.2, 9): False
//      (Ed, 78.8, 8) = (Judith, 84.3, 9): False
//
//      (Abbey, 92.1, 9) = (Jim, 71.2, 9): False
//      (Abbey, 92.1, 9) = (Sam, 91.7, 8): False
//      (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False
//      (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False
//      (Abbey, 92.1, 9) = (Serena, 71.2, 9): False
//      (Abbey, 92.1, 9) = (Judith, 84.3, 9): False
//      
//      (Jim, 71.2, 9) = (Sam, 91.7, 8): False
//      (Jim, 71.2, 9) = (Sandy, 71.2, 5): True
//      (Jim, 71.2, 9) = (Penelope, 82.9, 8): False
//      (Jim, 71.2, 9) = (Serena, 71.2, 9): True
//      (Jim, 71.2, 9) = (Judith, 84.3, 9): False
//
//      (Sam, 91.7, 8) = (Sandy, 71.2, 5): False
//      (Sam, 91.7, 8) = (Penelope, 82.9, 8): False
//      (Sam, 91.7, 8) = (Serena, 71.2, 9): False
//      (Sam, 91.7, 8) = (Judith, 84.3, 9): False
//
//      (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False
//      (Sandy, 71.2, 5) = (Serena, 71.2, 9): True
//      (Sandy, 71.2, 5) = (Judith, 84.3, 9): False
//
//      (Penelope, 82.9, 8) = (Serena, 71.2, 9): False
//      (Penelope, 82.9, 8) = (Judith, 84.3, 9): False
//
//      (Serena, 71.2, 9) = (Judith, 84.3, 9): False
open System
open System.Collections

type Item2Comparer<'T1, 'T2, 'T3 when 'T1: equality and 'T2: equality and 'T3: equality>() =
    interface IEqualityComparer with
        member _.Equals(x: obj, y: obj) =
            // Return true for all values of Item1.
            match x with
            | :? 'T1 ->
                true
            | :? 'T2 ->
                x.Equals y
            | _ -> true
   
        member _.GetHashCode(obj: obj) =
            match obj with
            | :? 'T1 as obj->
                obj.GetHashCode()
            | :? 'T2 as obj ->
                obj.GetHashCode()
            | _ ->
                (obj :?> 'T3).GetHashCode()

let scores = 
    [| Tuple.Create("Ed", 78.8, 8)
       Tuple.Create("Abbey", 92.1, 9) 
       Tuple.Create("Jim", 71.2, 9)
       Tuple.Create("Sam", 91.7, 8)
       Tuple.Create("Sandy", 71.2, 5)
       Tuple.Create("Penelope", 82.9, 8)
       Tuple.Create("Serena", 71.2, 9)
       Tuple.Create("Judith", 84.3, 9) |]

for ctr = 0 to scores.Length - 1 do
    let score : IStructuralEquatable = scores[ctr]
    for ctr2 = ctr + 1 to scores.Length - 1 do
        printfn $"{score} = {scores[ctr2]}: {score.Equals(scores[ctr2], Item2Comparer<string, double, int>())}"
    printfn ""
// The example displays the following output:
//      (Ed, 78.8, 8) = (Abbey, 92.1, 9): False
//      (Ed, 78.8, 8) = (Jim, 71.2, 9): False
//      (Ed, 78.8, 8) = (Sam, 91.7, 8): False
//      (Ed, 78.8, 8) = (Sandy, 71.2, 5): False
//      (Ed, 78.8, 8) = (Penelope, 82.9, 8): False
//      (Ed, 78.8, 8) = (Serena, 71.2, 9): False
//      (Ed, 78.8, 8) = (Judith, 84.3, 9): False
//
//      (Abbey, 92.1, 9) = (Jim, 71.2, 9): False
//      (Abbey, 92.1, 9) = (Sam, 91.7, 8): False
//      (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False
//      (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False
//      (Abbey, 92.1, 9) = (Serena, 71.2, 9): False
//      (Abbey, 92.1, 9) = (Judith, 84.3, 9): False
//      
//      (Jim, 71.2, 9) = (Sam, 91.7, 8): False
//      (Jim, 71.2, 9) = (Sandy, 71.2, 5): True
//      (Jim, 71.2, 9) = (Penelope, 82.9, 8): False
//      (Jim, 71.2, 9) = (Serena, 71.2, 9): True
//      (Jim, 71.2, 9) = (Judith, 84.3, 9): False
//
//      (Sam, 91.7, 8) = (Sandy, 71.2, 5): False
//      (Sam, 91.7, 8) = (Penelope, 82.9, 8): False
//      (Sam, 91.7, 8) = (Serena, 71.2, 9): False
//      (Sam, 91.7, 8) = (Judith, 84.3, 9): False
//
//      (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False
//      (Sandy, 71.2, 5) = (Serena, 71.2, 9): True
//      (Sandy, 71.2, 5) = (Judith, 84.3, 9): False
//
//      (Penelope, 82.9, 8) = (Serena, 71.2, 9): False
//      (Penelope, 82.9, 8) = (Judith, 84.3, 9): False
//
//      (Serena, 71.2, 9) = (Judith, 84.3, 9): False
Imports System.Collections

Public Class Item2Comparer(Of T1, T2, T3) : 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
      ElseIf TypeOf x Is T2 Then
         Return x.Equals(y)
      Else
         Return True
      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()
      ElseIf TypeOf obj Is T2 Then
         Return CType(obj, T2).GetHashCode()
      Else	
         Return CType(obj, T3).GetHashCode()
      End If   
   End Function                
End Class

Module Example
   Public Sub Main()
      Dim scores() = 
                { Tuple.Create("Ed", 78.8, 8),
                  Tuple.Create("Abbey", 92.1, 9), 
                  Tuple.Create("Jim", 71.2, 9),
                  Tuple.Create("Sam", 91.7, 8), 
                  Tuple.Create("Sandy", 71.2, 5),
                  Tuple.Create("Penelope", 82.9, 8),
                  Tuple.Create("Serena", 71.2, 9),
                  Tuple.Create("Judith", 84.3, 9) }

      For ctr As Integer = 0 To scores.Length - 1
         Dim score As IStructuralEquatable = scores(ctr)
         For ctr2 As Integer = ctr + 1 To scores.Length - 1
            Console.WriteLine("{0} = {1}: {2}", score, 
                              scores(ctr2), 
                              score.Equals(scores(ctr2), 
                                           new Item2Comparer(Of String, Double, Integer)))
         Next
         Console.WriteLine()
      Next                     
   End Sub
End Module
' The example displays the following output:
'      (Ed, 78.8, 8) = (Abbey, 92.1, 9): False
'      (Ed, 78.8, 8) = (Jim, 71.2, 9): False
'      (Ed, 78.8, 8) = (Sam, 91.7, 8): False
'      (Ed, 78.8, 8) = (Sandy, 71.2, 5): False
'      (Ed, 78.8, 8) = (Penelope, 82.9, 8): False
'      (Ed, 78.8, 8) = (Serena, 71.2, 9): False
'      (Ed, 78.8, 8) = (Judith, 84.3, 9): False
'      
'      (Abbey, 92.1, 9) = (Jim, 71.2, 9): False
'      (Abbey, 92.1, 9) = (Sam, 91.7, 8): False
'      (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False
'      (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False
'      (Abbey, 92.1, 9) = (Serena, 71.2, 9): False
'      (Abbey, 92.1, 9) = (Judith, 84.3, 9): False
'
'      (Jim, 71.2, 9) = (Sam, 91.7, 8): False
'      (Jim, 71.2, 9) = (Sandy, 71.2, 5): True
'      (Jim, 71.2, 9) = (Penelope, 82.9, 8): False
'      (Jim, 71.2, 9) = (Serena, 71.2, 9): True
'      (Jim, 71.2, 9) = (Judith, 84.3, 9): False
'
'      (Sam, 91.7, 8) = (Sandy, 71.2, 5): False
'      (Sam, 91.7, 8) = (Penelope, 82.9, 8): False
'      (Sam, 91.7, 8) = (Serena, 71.2, 9): False
'      (Sam, 91.7, 8) = (Judith, 84.3, 9): False
'
'      (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False
'      (Sandy, 71.2, 5) = (Serena, 71.2, 9): True
'      (Sandy, 71.2, 5) = (Judith, 84.3, 9): False
'
'      (Penelope, 82.9, 8) = (Serena, 71.2, 9): False
'      (Penelope, 82.9, 8) = (Judith, 84.3, 9): False
'
'      (Serena, 71.2, 9) = (Judith, 84.3, 9): False

설명

이 멤버는 명시적 인터페이스 멤버 구현이며, Tuple<T1,T2,T3> 인스턴스가 IStructuralEquatable 인터페이스로 캐스팅된 경우에만 사용할 수 있습니다.

IEqualityComparer.Equals 구현은 그렇지 않은 null경우에만 호출되며 C#에서 성공적으로 캐스팅되거나(Visual Basic) Tuple<T1,T2,T3> 구성 요소가 현재 인스턴스와 동일한 형식의 개체로 변환될 수 있는 경우에만 other 호출됩니다. 메서드는 Tuple<T1,T2,T3>.IStructuralEquatable.Equals 먼저 구현과 Item1 비교할 개체의 Tuple<T1,T2,T3> 값을 전달합니다 IEqualityComparer.Equals . 이 메서드 호출이 반환true되면 메서드가 다시 호출되고 두 Tuple<T1,T2,T3> 개체의 값이 전달됩니다Item2. 이 메서드 호출이 다시 반환 true 되면 메서드를 세 번째로 호출하고 두 Tuple<T1,T2,T3> 개체의 값을 전달 Item3 합니다.

적용 대상