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
2 つのオブジェクトが等しいかどうかの評価に使用するメソッドを定義するオブジェクト。
戻り値
現在のインスタンスが指定したオブジェクトと等しい場合は true
。それ以外の場合は false
。
実装
例
次の例では、 DoubleComparer
インターフェイスを実装する IEqualityComparer クラスを定義しています。 この例では、乱数ジェネレーターを使用して 2 つの Tuple<T1,T2,T3,T4,T5> オブジェクトをインスタンス化し、2 番目のコンポーネントから 5 番目のコンポーネントを設定し、最初のインスタンスを IStructuralEquatable インターフェイスにキャストしてから、 オブジェクトを DoubleComparer
使用して 2 つの 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
場合にのみ呼び出され、コンポーネントが現在のインスタンスと同じ型のオブジェクトにTuple<T1,T2,T3,T4,T5>正常にキャスト (C#) または変換 (Visual Basic では) できる場合other
にのみ呼び出されます。 メソッドは IStructuralEquatable.Equals(Object, IEqualityComparer) 、実装と Item1 比較するオブジェクトの Tuple<T1,T2,T3,T4,T5> 値を最初に IEqualityComparer.Equals 渡します。 このメソッド呼び出しで がtrue
返された場合、メソッドが再度呼び出され、2 つのTuple<T1,T2,T3,T4,T5>オブジェクトの値が渡されますItem2。 これは、メソッド呼び出し false
が特定の値の Item
ペアを比較するとき、または 2 つの Item5 値が メソッドに渡されるまで続きます。
適用対象
.NET