Tuple<T1,T2,T3,T4,T5>.IStructuralEquatable.Equals 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
지정된 비교 메서드를 기반으로 현재 Tuple<T1,T2,T3,T4,T5> 개체가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.
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
두 개체가 같은지 여부를 평가하는 데 사용할 방법을 정의하는 개체입니다.
반환
현재 인스턴스가 지정된 개체와 같으면 true
이고, 그렇지 않으면 false
입니다.
구현
예제
다음 예제에서는 DoubleComparer
인터페이스를 구현하는 IEqualityComparer 클래스를 정의합니다. 이 예제에서는 난수 생성기를 사용하여 두 Tuple<T1,T2,T3,T4,T5> 번째부터 다섯 번째 구성 요소를 채우고, 첫 번째 인스턴스를 인터페이스로 IStructuralEquatable 캐스팅한 다음, 개체를 사용하여 DoubleComparer
두 Tuple<T1,T2,T3,T4,T5> 개체를 대략적인 같음으로 테스트합니다.
using System;
using System.Collections;
public class DoubleComparer<T1, T2, T3, T4, T5> : IEqualityComparer
{
private double difference;
private int argument = 0;
public DoubleComparer(double difference)
{
this.difference = difference;
}
new public bool Equals(object x, object y)
{
argument += 1;
// Return true for Item1.
if (argument == 1) return true;
double d1 = (double) x;
double d2 = (double) y;
if (d1 - d2 < d1 * difference)
return true;
else
return false;
}
public int GetHashCode(object obj)
{
if (obj is T1)
return ((T1) obj).GetHashCode();
else if (obj is T2)
return ((T2) obj).GetHashCode();
else if (obj is T3)
return ((T3) obj).GetHashCode();
else if (obj is T4)
return ((T4) obj).GetHashCode();
else
return ((T5) obj).GetHashCode();
}
}
public class Example
{
public static void Main()
{
var value1 = GetValues(1);
var value2 = GetValues(2);
IStructuralEquatable iValue1 = value1;
Console.WriteLine("{0} =\n{1} :\n{2}", value1, value2,
iValue1.Equals(value2,
new DoubleComparer<int, double, double, double, double>(.01)));
}
private static Tuple<int, double, double, double, double> GetValues(int ctr)
{
// Generate four random numbers between 0 and 1
Random rnd = new Random((int)DateTime.Now.Ticks >> 32 >> ctr);
return Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(),
rnd.NextDouble(), rnd.NextDouble());
}
}
open System
open System.Collections
type DoubleComparer<'T1, 'T2, 'T3, 'T4, 'T5 when 'T1: equality and 'T2: equality and 'T3: equality and 'T4: equality and 'T5: equality>(difference: double) =
let mutable argument = 0
interface IEqualityComparer with
member _.Equals(x, y) =
argument <- argument + 1
// Return true for Item1.
if argument = 1 then
true
else
let d1 = x :?> double
let d2 = y :?> double
d1 - d2 < d1 * difference
member _.GetHashCode(obj) =
match obj with
| :? 'T1 as obj -> obj.GetHashCode()
| :? 'T2 as obj -> obj.GetHashCode()
| :? 'T3 as obj -> obj.GetHashCode()
| :? 'T4 as obj -> obj.GetHashCode()
| _ -> (obj :?> 'T5).GetHashCode()
let getValues ctr =
// Generate four random numbers between 0 and 1
let rnd = Random(DateTime.Now.Ticks >>> 32 >>> ctr |> int)
Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(), rnd.NextDouble(), rnd.NextDouble())
let value1 = getValues 1
let value2 = getValues 2
let iValue1 = value1
printfn $"{value1} =\n{value2} :\n{(DoubleComparer<int, double, double, double, double> 0.01 :> IEqualityComparer).Equals(iValue1, value2)}"
Imports System.Collections
Public Class DoubleComparer(Of T1, T2, T3, T4, T5) : Implements IEqualityComparer
Private difference As Double
Private argument As Integer = 0
Public Sub New(difference As Double)
Me.difference = difference
End Sub
Public Overloads Function Equals(x As Object, y As Object) As Boolean _
Implements IEqualityComparer.Equals
argument += 1
' Return true for Item1.
If argument = 1 Then
Return True
Else
Dim d1 As Double = CDbl(x)
Dim d2 As Double = CDbl(y)
If d1 - d2 < d1 * difference Then
Return True
Else
Return False
End If
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()
ElseIf TypeOf obj Is T3 Then
Return CType(Obj, T3).GetHashCode()
ElseIf TypeOf obj Is T4 Then
Return CType(Obj, T4).GetHashCode()
Else
Return CType(obj, T5).GetHashCode()
End If
End Function
End Class
Module Example
Public Sub Main()
Dim value1 = GetValues(1)
Dim value2 = GetValues(2)
Dim iValue1 As IStructuralEquatable = value1
Console.WriteLine("{0} ={3}{1} :{3}{2}", value1, value2, _
iValue1.Equals(value2, _
New DoubleComparer(Of Integer, Double, Double, Double, Double)(.01)), _
vbCrLf)
End Sub
Private Function GetValues(ctr As Integer) As Tuple(Of Integer, Double, Double, Double, Double)
' Generate four random numbers between 0 and 1
Dim rnd As New Random(CInt((DateTime.Now.Ticks >> 32) >> ctr))
Return Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(),
rnd.NextDouble(), rnd.NextDouble)
End Function
End Module
' The example displays output like the following:
' (1, 0.910850029862882, 0.894596965934428, 0.319678635019659, 0.801647342649124) =
' (2, 0.818546649915421, 0.355961162762698, 0.0438506622071614, 0.679904267042831) :
' False
설명
이 멤버는 명시적 인터페이스 멤버 구현이며, Tuple<T1,T2,T3,T4,T5> 인스턴스가 IStructuralEquatable 인터페이스로 캐스팅된 경우에만 사용할 수 있습니다.
IEqualityComparer.Equals 구현은 그렇지 않은 null
경우에만 호출되며 C#에서 성공적으로 캐스팅되거나(Visual Basic) Tuple<T1,T2,T3,T4,T5> 구성 요소가 현재 인스턴스와 동일한 형식의 개체로 변환될 수 있는 경우에만 other
호출됩니다. 메서드는 IStructuralEquatable.Equals(Object, IEqualityComparer) 먼저 구현과 Item1 비교할 개체의 Tuple<T1,T2,T3,T4,T5> 값을 전달합니다 IEqualityComparer.Equals . 이 메서드 호출이 반환true
되면 메서드가 다시 호출되고 두 Tuple<T1,T2,T3,T4,T5> 개체의 값이 전달됩니다Item2. 이 작업은 메서드 호출이 특정 값 쌍 Item
을 비교할 때 반환 false
되거나 두 Item5 값이 메서드에 전달될 때까지 계속됩니다.