Tuple<T1>.IStructuralEquatable.Equals(Object, IEqualityComparer) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
지정된 비교 메서드를 기반으로 현재 Tuple<T1> 개체가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.
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
입니다.
구현
예제
다음 예제에서는 두 부동 소수점 값이 서로 거의 같은 경우(즉, 한 값이 다른 값의 .01% 내에 있는 경우) 같은 것으로 간주하는 구현을 정의 IEqualityComparer 합니다.
using System;
using System.Collections;
public class Tuple1Comparer : IEqualityComparer
{
new public bool Equals(object x, object y)
{
// Check if x is a floating point type. If x is, then y is.
if (x is double | x is float)
{
// Convert to Double values.
double dblX = (double) x;
double dblY = (double) y;
if (Double.IsNaN(dblX) | Double.IsInfinity(dblX) |
Double.IsNaN(dblY) | Double.IsInfinity(dblY))
return dblX.Equals(dblY);
else
return Math.Abs(dblX - dblY) <= dblX * .0001;
}
else
{
return x.Equals(y);
}
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}
public class Example
{
public static void Main()
{
var doubleTuple1 = Tuple.Create(12.3455);
var doubleTuple2 = Tuple.Create(16.8912);
var doubleTuple3 = Tuple.Create(12.3449599);
// Compare first tuple with a Tuple<double> with a different value.
TestEquality(doubleTuple1, doubleTuple2);
//Compare first tuple with a Tuple<double> with the same value.
TestEquality(doubleTuple1, doubleTuple3);
}
private static void TestEquality(Tuple<double> tuple, object obj)
{
Console.WriteLine("{0} = {1}: {2}", tuple.ToString(),
obj.ToString(),
((IStructuralEquatable)tuple).Equals(obj, new Tuple1Comparer()));
}
}
// The example displays the following output:
// (12.3455) = (16.8912): False
// (12.3455) = (12.3449599): True
open System
open System.Collections
type Tuple1Comparer() =
interface IEqualityComparer with
member _.Equals(x: obj, y: obj) =
match x with
| :? double as dblX ->
// Convert to Double values.
let dblY = y :?> double
if Double.IsNaN dblX || Double.IsInfinity dblX ||
Double.IsNaN dblY || Double.IsInfinity dblY then
dblX.Equals dblY
else
abs (dblX - dblY) <= dblX * 0.0001
| _ ->
x.Equals y
member _.GetHashCode(obj: obj) =
obj.GetHashCode()
let testEquality (tuple: Tuple<double>) (obj: obj) =
printfn $"{tuple} = {obj}: {(tuple :> IStructuralEquatable).Equals(obj, Tuple1Comparer())}"
let doubleTuple1 = Tuple.Create 12.3455
let doubleTuple2 = Tuple.Create 16.8912
let doubleTuple3 = Tuple.Create 12.3449599
// Compare first tuple with a Tuple<double> with a different value.
testEquality doubleTuple1 doubleTuple2
//Compare first tuple with a Tuple<double> with the same value.
testEquality doubleTuple1 doubleTuple3
// The example displays the following output:
// (12.3455) = (16.8912): False
// (12.3455) = (12.3449599): True
Imports System.Collections
Public Class Tuple1Comparer : Implements IEqualityComparer
Public Overloads Function Equals(x As Object, y As Object) As Boolean _
Implements IEqualityComparer.Equals
' Check if x is a floating point type. If x is, then y is.
If TypeOf x Is Double Or TypeOf x Is Single Then
' Convert to Double values.
Dim dblX As Double = CDbl(x)
Dim dblY As Double = CDbl(y)
If Double.IsNan(dblX) Or Double.IsInfinity(dblX) Or _
Double.IsNan(dblY) Or Double.IsInfinity(dblY) Then
Return dblX.Equals(dblY)
Else
Return Math.Abs(dblX - dblY) <= dblY * .0001
End If
Else
Return x.Equals(y)
End If
End Function
Public Overloads Function GetHashCode(obj As Object) As Integer _
Implements IEqualityComparer.GetHashCode
Return obj.GetHashCode()
End Function
End Class
Module Example
Public Sub Main()
Dim doubleTuple1 = Tuple.Create(12.3455)
Dim doubleTuple2 = Tuple.Create(16.8912)
Dim doubleTuple3 = Tuple.Create(12.3449599)
' Compare first tuple with a Tuple(Of Double) with a different value.
TestEquality(doubleTuple1, doubleTuple2)
' Compare first tuple with a Tuple(Of Double) with the same value.
TestEquality(doubleTuple1, doubleTuple3)
End Sub
Private Sub TestEquality(tuple As Tuple(Of Double), obj As Object)
Try
Console.WriteLine("{0} = {1}: {2}", tuple.ToString(),
obj.ToString,
DirectCAst(tuple, IStructuralEquatable).Equals(obj, New Tuple1Comparer()))
Catch e As ArgumentException
If obj.GetType.IsGenericType Then
If obj.GetType().Name = "Tuple`1" Then
Console.WriteLine("Cannot compare a Tuple(Of {0}) with a Tuple(Of {1}).",
tuple.Item1.GetType().Name, obj.Item1.GetType().Name)
Else
Console.WriteLine("Cannot compare a {0} with a {1}.", tuple.GetType().Name,
obj.GetType().Name)
End If
Else
Console.WriteLine("Cannot compare a {0} with a {1}.", tuple.GetType().Name,
obj.GetType().Name)
End If
End Try
End Sub
End Module
' The example displays the following output:
' (12.3455) = (16.8912): False
' (12.3455) = (12.3449599): True
설명
이 멤버는 명시적 인터페이스 멤버 구현이며, Tuple<T1> 인스턴스가 IStructuralEquatable 인터페이스로 캐스팅된 경우에만 사용할 수 있습니다.
구현은 IEqualityComparer.Equals 가 이 아닌 null
경우에만 호출되며, C#에서 성공적으로 캐스팅되거나(Visual Basic에서) Tuple<T1> 단일 구성 요소가 현재 인스턴스와 동일한 형식의 개체로 변환될 수 있는 경우에만 other
호출됩니다. 메서드는 현재 인스턴스의 Item1 구성 요소와 매개 변수가 Item1 나타내는 개체의 Tuple<T1> 구성 요소를 전달합니다 other
.
적용 대상
추가 정보
.NET