다음을 통해 공유


Tuple<T1,T2,T3,T4,T5,T6,T7>.IStructuralEquatable.Equals 메서드

정의

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

 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입니다.

구현

예제

다음 예제에서는 같은지 사용자 지정 테스트를 수행하는 클래스를 정의 RateComparer 합니다. 해당 IStructuralEquatable.Equals 메서드에 전달되는 값이 형식이거나 Double형식 Single 인 경우 메서드는 최대 3개의 소수 자릿수만 사용하여 같음을 테스트합니다. 그렇지 않으면 매개 변수의 Equals 메서드를 x 호출하기만 하면 됩니다. 이 예제에서는 이 IEqualityComparer 구현을 사용하여 1950년에서 2000년 사이의 인구 변화율에 대한 데이터를 포함하는 네 개의 Tuple<T1,T2,T3,T4,T5,T6,T7> 개체가 같은지 여부를 확인합니다.

using System;
using System.Collections;

public class RateComparer<T1, T2, T3, T4, T5, T6, T7> : IEqualityComparer
{
   private int argument = 0;

   public new bool Equals(object x, object y)
   {
      argument++;
      if (argument == 1) return true;

      double fx, fy;
      if (x is Double || x is Single)
      {
            fx = (double) x;
            fy = (double) y;
            return Math.Round(fx * 1000).Equals(Math.Round(fy * 1000));
      }
      else
      {
         return x.Equals(y);
      }
   }

   public int GetHashCode(object obj)
   {
      if (obj is Single || obj is Double)
         return Math.Round(((double) obj) * 1000).GetHashCode();
      else
         return obj.GetHashCode();
   }
}

public class Example
{
   public static void Main()
   {
      var rate1 = Tuple.Create("New York", -.013934, .014505,
                               -.1042733, .0354833, .093644, .0290792);
      var rate2 = Tuple.Create("Unknown City", -.013934, .014505,
                               -.1042733, .0354833, .093644, .0290792);
      var rate3 = Tuple.Create("Unknown City", -.013934, .014505,
                               -.1042733, .0354833, .093644, .029079);
      var rate4 = Tuple.Create("San Francisco", -.0451934, -.0332858,
                               -.0512803, .0662544, .0728964, .0491912);
      IStructuralEquatable eq = rate1;
      // Compare first tuple with remaining two tuples.
      Console.WriteLine("{0} = ", rate1.ToString());
      Console.WriteLine("   {0} : {1}", rate2,
                        eq.Equals(rate2, new RateComparer<string, double, double, double, double, double, double>()));
      Console.WriteLine("   {0} : {1}", rate3,
                        eq.Equals(rate3, new RateComparer<string, double, double, double, double, double, double>()));
      Console.WriteLine("   {0} : {1}", rate4,
                        eq.Equals(rate4, new RateComparer<string, double, double,double,  double, double, double>()));
   }
}
// The example displays the following output:
//    (New York, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
//       (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
//       (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
//       (San Francisco, -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
open System
open System.Collections

type RateComparer<'T1, 'T2, 'T3, 'T4, 'T5, 'T6, 'T7>() =
    let mutable argument = 0

    interface IEqualityComparer with
        member _.Equals(x, y) =
            argument <- argument + 1
            if argument = 1 then
                true
            else
                if x :? Double || x :? Single then
                    let fx = x :?> double
                    let fy = y :?> double
                    Math.Round(fx * 1000.).Equals(Math.Round(fy * 1000.))
                else
                    x.Equals y

        member _.GetHashCode(obj) =
            if obj :? Single || obj :? Double then
                Math.Round((obj :?> double) * 1000.).GetHashCode()
            else
                obj.GetHashCode()

let rate1 = Tuple.Create("New York", -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792)
let rate2 = Tuple.Create("Unknown City", -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792)
let rate3 = Tuple.Create("Unknown City", -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079)
let rate4 = Tuple.Create("San Francisco", -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912)
let eq: IStructuralEquatable = rate1
// Compare first tuple with remaining two tuples.
printfn $"{rate1} = "
printfn $"   {rate2} : {eq.Equals(rate2, RateComparer<string, double, double, double, double, double, double>())}"
printfn $"   {rate3} : {eq.Equals(rate3, RateComparer<string, double, double, double, double, double, double>())}"
printfn $"   {rate4} : {eq.Equals(rate4, RateComparer<string, double, double,double,  double, double, double>())}"
// The example displays the following output:
//    (New York, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
//       (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
//       (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
//       (San Francisco, -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
Imports System.Collections

Public Class RateComparer(Of T1, T2, T3, T4, T5, T6, T7) : Implements IEqualityComparer
   Private argument As Integer = 0

   Public Overloads Function Equals(x As Object, y As Object) As Boolean _
                   Implements IEqualityComparer.Equals
      argument += 1
      If argument = 1 Then
         Return True
      Else
         Dim fx, fy As Double
         If typeof x Is Double Or typeof x Is Single Then
            fx = CDbl(x)
            fy = CDbl(y)
            Return Math.Round(fx * 1000).Equals(Math.Round(fy * 1000))
         Else
            Return x.Equals(y)
         End If
      End If   
   End Function
   
   Public Overloads Function GetHashCode(obj As Object) As Integer _
                    Implements IEqualityComparer.GetHashCode
      If TypeOf(obj) Is Single Or TypeOf(obj) Is Double Then
         Return Math.Round(CDbl(obj) * 1000).GetHashCode()
      Else
         Return obj.GetHashCode()
      End If
   End Function                
End Class

Module Example
   Public Sub Main()
      Dim rate1 = Tuple.Create("New York", -.013934, .014505, 
                               -.1042733, .0354833, .093644, .0290792)
      Dim rate2 = Tuple.Create("Unknown City", -.013934, .014505, 
                               -.1042733, .0354833, .093644, .0290792)
      Dim rate3 = Tuple.Create("Unknown City", -.013934, .014505, 
                               -.1042733, .0354833, .093644, .029079)
      Dim rate4 = Tuple.Create("San Francisco", -.0451934, -.0332858, 
                               -.0512803, .0662544, .0728964, .0491912)
      Dim eq As IStructuralEquatable = rate1
      ' Compare first tuple with remaining two tuples.
      Console.WriteLine("{0} = ", rate1.ToString())
      Console.WriteLine("   {0} : {1}", rate2, 
                        eq.Equals(rate2, New RateComparer(Of String, Double, Double, Double, Double, Double, Double)()))
      Console.WriteLine("   {0} : {1}", rate3, 
                        eq.Equals(rate3, New RateComparer(Of String, Double, Double, Double, Double, Double, Double)()))
      Console.WriteLine("   {0} : {1}", rate4, 
                        eq.Equals(rate4, New RateComparer(Of String, Double, Double, Double, Double, Double, Double)()))
   End Sub
End Module
' The example displays the following output:
'    (New York, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
'       (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
'       (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
'       (San Francisco, -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False

설명

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

구현은 IEqualityComparer.Equals 다른 항목이 아닌 null경우에만 호출되며, 구성 요소가 현재 인스턴스와 동일한 형식인 개체로 성공적으로 캐스팅(C#) 또는 변환(Visual Basic)Tuple<T1,T2,T3,T4,T5,T6,T7>할 수 있는 경우에만 호출됩니다. 메서드는 IStructuralEquatable.Equals(Object, IEqualityComparer) 먼저 구현과 Item1 비교할 IEqualityComparer.Equals 개체의 Tuple<T1,T2,T3,T4,T5,T6,T7> 값을 전달합니다. 이 메서드 호출이 반환true되면 메서드가 다시 호출되고 두 Tuple<T1,T2,T3,T4,T5,T6,T7> 개체의 값이 전달됩니다Item2. 이 작업은 메서드 호출이 특정 값 쌍 Item 을 비교할 때 반환 false 되거나 두 Item7 값이 메서드에 전달될 때까지 계속됩니다.

적용 대상