Tuple<T1,T2>.IStructuralEquatable.Equals Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает значение, показывающее, равен ли текущий атрибут 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> вычисления объектов на равенство. Метод всегда возвращается true
при передаче Item1 значений свойств двух Tuple<T1,T2> объектов, и вызывает 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 вызывается только в том случае, если other
она отсутствуетnull
, и если ее можно успешно привести (в C#) или преобразовать (в Visual Basic) в Tuple<T1,T2> объект, компоненты которого имеют те же типы, что и текущий экземпляр. Метод IStructuralEquatable.Equals сначала передает Item1 значения Tuple<T1,T2> объектов, которые будут сравниваться с реализацией IEqualityComparer.Equals . Если этот вызов метода возвращается true
, метод вызывается снова и передает Item2 значения двух Tuple<T1,T2> объектов.