Tuple<T1,T2>.IStructuralEquatable.Equals 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
지정된 비교 메서드를 기반으로 현재 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
두 개체가 같은지 여부를 평가하는 데 사용할 방법을 정의하는 개체입니다.
반환
현재 인스턴스가 지정된 개체와 같으면 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.