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> 會使用亂數產生器將兩個物件具現化,以填入其第二個到第五個元件、將第一個 DoubleComparer
實例轉換成介面,然後使用 物件來測試兩 Tuple<T1,T2,T3,T4,T5> 個 IStructuralEquatable 物件是否相等。
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 作,如果它可以在 C# ) 中成功轉換 (,或在 Visual Basic) 中轉換成與目前實例相同類型的物件 (Tuple<T1,T2,T3,T4,T5> 。 null
other
方法 IStructuralEquatable.Equals(Object, IEqualityComparer) 會先傳遞 Item1 要與實作比較 IEqualityComparer.Equals 的物件值 Tuple<T1,T2,T3,T4,T5> 。 如果這個方法呼叫傳 true
回 ,則會再次呼叫 方法,並傳遞 Item2 兩 Tuple<T1,T2,T3,T4,T5> 個 物件的值。 這會繼續執行,直到方法呼叫在比較特定一組 Item
值時傳回 false
,或將兩 Item5 個值傳遞至 方法為止。