Tuple<T1,T2,T3>.IStructuralEquatable.Equals メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
指定された比較メソッドに基づいて、現在の Tuple<T1,T2,T3> オブジェクトが指定したオブジェクトと等しいかどうかを示す値を返します。
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
。
実装
例
次の例では、インターフェイスを Item2Comparer
実装し、オブジェクトが IEqualityComparer 等しいかどうかを評価する方法を変更する Tuple<T1,T2,T3> クラスを定義します。 このメソッドは、2 つのオブジェクトのtrue
プロパティ値が渡されたときに常にItem1返され、メソッドをTuple<T1,T2,T3>.IStructuralEquatable.Equals呼び出してプロパティ値をItem2評価Tuple<T1,T2,T3>します。 このメソッドの呼び出しが true
返された場合、その Item3 プロパティ値は常に返 true
されるメソッドに渡されます。 その結果、メソッドはプロパティの値のみに基づいて等価性を Item2 テストします。 出力は、名前、平均テスト スコア、およびクラス内の学生の Tuple<T1,T2,T3> テスト数を記録するオブジェクトのデータ セットの結果を示しています。
using System;
using System.Collections;
public class Item2Comparer<T1, T2, T3> : IEqualityComparer
{
new public bool Equals(object x, object y)
{
// Return true for all values of Item1.
if (x is T1)
return true;
else if (x is T2)
return x.Equals(y);
else
return true;
}
public int GetHashCode(object obj)
{
if (obj is T1)
return ((T1) obj).GetHashCode();
else if (obj is T2)
return ((T2) obj).GetHashCode();
else
return ((T3) obj).GetHashCode();
}
}
public class Example
{
public static void Main()
{
Tuple<string, double, int>[] scores =
{ Tuple.Create("Ed", 78.8, 8),
Tuple.Create("Abbey", 92.1, 9),
Tuple.Create("Jim", 71.2, 9),
Tuple.Create("Sam", 91.7, 8),
Tuple.Create("Sandy", 71.2, 5),
Tuple.Create("Penelope", 82.9, 8),
Tuple.Create("Serena", 71.2, 9),
Tuple.Create("Judith", 84.3, 9) };
for (int ctr = 0; ctr < scores.Length; ctr++)
{
IStructuralEquatable score = scores[ctr];
for (int ctr2 = ctr + 1; ctr2 < scores.Length; ctr2++)
{
Console.WriteLine("{0} = {1}: {2}", score,
scores[ctr2],
score.Equals(scores[ctr2],
new Item2Comparer<string, double, int>()));
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// (Ed, 78.8, 8) = (Abbey, 92.1, 9): False
// (Ed, 78.8, 8) = (Jim, 71.2, 9): False
// (Ed, 78.8, 8) = (Sam, 91.7, 8): False
// (Ed, 78.8, 8) = (Sandy, 71.2, 5): False
// (Ed, 78.8, 8) = (Penelope, 82.9, 8): False
// (Ed, 78.8, 8) = (Serena, 71.2, 9): False
// (Ed, 78.8, 8) = (Judith, 84.3, 9): False
//
// (Abbey, 92.1, 9) = (Jim, 71.2, 9): False
// (Abbey, 92.1, 9) = (Sam, 91.7, 8): False
// (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False
// (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False
// (Abbey, 92.1, 9) = (Serena, 71.2, 9): False
// (Abbey, 92.1, 9) = (Judith, 84.3, 9): False
//
// (Jim, 71.2, 9) = (Sam, 91.7, 8): False
// (Jim, 71.2, 9) = (Sandy, 71.2, 5): True
// (Jim, 71.2, 9) = (Penelope, 82.9, 8): False
// (Jim, 71.2, 9) = (Serena, 71.2, 9): True
// (Jim, 71.2, 9) = (Judith, 84.3, 9): False
//
// (Sam, 91.7, 8) = (Sandy, 71.2, 5): False
// (Sam, 91.7, 8) = (Penelope, 82.9, 8): False
// (Sam, 91.7, 8) = (Serena, 71.2, 9): False
// (Sam, 91.7, 8) = (Judith, 84.3, 9): False
//
// (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False
// (Sandy, 71.2, 5) = (Serena, 71.2, 9): True
// (Sandy, 71.2, 5) = (Judith, 84.3, 9): False
//
// (Penelope, 82.9, 8) = (Serena, 71.2, 9): False
// (Penelope, 82.9, 8) = (Judith, 84.3, 9): False
//
// (Serena, 71.2, 9) = (Judith, 84.3, 9): False
open System
open System.Collections
type Item2Comparer<'T1, 'T2, 'T3 when 'T1: equality and 'T2: equality and 'T3: equality>() =
interface IEqualityComparer with
member _.Equals(x: obj, y: obj) =
// Return true for all values of Item1.
match x with
| :? 'T1 ->
true
| :? 'T2 ->
x.Equals y
| _ -> true
member _.GetHashCode(obj: obj) =
match obj with
| :? 'T1 as obj->
obj.GetHashCode()
| :? 'T2 as obj ->
obj.GetHashCode()
| _ ->
(obj :?> 'T3).GetHashCode()
let scores =
[| Tuple.Create("Ed", 78.8, 8)
Tuple.Create("Abbey", 92.1, 9)
Tuple.Create("Jim", 71.2, 9)
Tuple.Create("Sam", 91.7, 8)
Tuple.Create("Sandy", 71.2, 5)
Tuple.Create("Penelope", 82.9, 8)
Tuple.Create("Serena", 71.2, 9)
Tuple.Create("Judith", 84.3, 9) |]
for ctr = 0 to scores.Length - 1 do
let score : IStructuralEquatable = scores[ctr]
for ctr2 = ctr + 1 to scores.Length - 1 do
printfn $"{score} = {scores[ctr2]}: {score.Equals(scores[ctr2], Item2Comparer<string, double, int>())}"
printfn ""
// The example displays the following output:
// (Ed, 78.8, 8) = (Abbey, 92.1, 9): False
// (Ed, 78.8, 8) = (Jim, 71.2, 9): False
// (Ed, 78.8, 8) = (Sam, 91.7, 8): False
// (Ed, 78.8, 8) = (Sandy, 71.2, 5): False
// (Ed, 78.8, 8) = (Penelope, 82.9, 8): False
// (Ed, 78.8, 8) = (Serena, 71.2, 9): False
// (Ed, 78.8, 8) = (Judith, 84.3, 9): False
//
// (Abbey, 92.1, 9) = (Jim, 71.2, 9): False
// (Abbey, 92.1, 9) = (Sam, 91.7, 8): False
// (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False
// (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False
// (Abbey, 92.1, 9) = (Serena, 71.2, 9): False
// (Abbey, 92.1, 9) = (Judith, 84.3, 9): False
//
// (Jim, 71.2, 9) = (Sam, 91.7, 8): False
// (Jim, 71.2, 9) = (Sandy, 71.2, 5): True
// (Jim, 71.2, 9) = (Penelope, 82.9, 8): False
// (Jim, 71.2, 9) = (Serena, 71.2, 9): True
// (Jim, 71.2, 9) = (Judith, 84.3, 9): False
//
// (Sam, 91.7, 8) = (Sandy, 71.2, 5): False
// (Sam, 91.7, 8) = (Penelope, 82.9, 8): False
// (Sam, 91.7, 8) = (Serena, 71.2, 9): False
// (Sam, 91.7, 8) = (Judith, 84.3, 9): False
//
// (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False
// (Sandy, 71.2, 5) = (Serena, 71.2, 9): True
// (Sandy, 71.2, 5) = (Judith, 84.3, 9): False
//
// (Penelope, 82.9, 8) = (Serena, 71.2, 9): False
// (Penelope, 82.9, 8) = (Judith, 84.3, 9): False
//
// (Serena, 71.2, 9) = (Judith, 84.3, 9): False
Imports System.Collections
Public Class Item2Comparer(Of T1, T2, T3) : 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
ElseIf TypeOf x Is T2 Then
Return x.Equals(y)
Else
Return True
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()
Else
Return CType(obj, T3).GetHashCode()
End If
End Function
End Class
Module Example
Public Sub Main()
Dim scores() =
{ Tuple.Create("Ed", 78.8, 8),
Tuple.Create("Abbey", 92.1, 9),
Tuple.Create("Jim", 71.2, 9),
Tuple.Create("Sam", 91.7, 8),
Tuple.Create("Sandy", 71.2, 5),
Tuple.Create("Penelope", 82.9, 8),
Tuple.Create("Serena", 71.2, 9),
Tuple.Create("Judith", 84.3, 9) }
For ctr As Integer = 0 To scores.Length - 1
Dim score As IStructuralEquatable = scores(ctr)
For ctr2 As Integer = ctr + 1 To scores.Length - 1
Console.WriteLine("{0} = {1}: {2}", score,
scores(ctr2),
score.Equals(scores(ctr2),
new Item2Comparer(Of String, Double, Integer)))
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' (Ed, 78.8, 8) = (Abbey, 92.1, 9): False
' (Ed, 78.8, 8) = (Jim, 71.2, 9): False
' (Ed, 78.8, 8) = (Sam, 91.7, 8): False
' (Ed, 78.8, 8) = (Sandy, 71.2, 5): False
' (Ed, 78.8, 8) = (Penelope, 82.9, 8): False
' (Ed, 78.8, 8) = (Serena, 71.2, 9): False
' (Ed, 78.8, 8) = (Judith, 84.3, 9): False
'
' (Abbey, 92.1, 9) = (Jim, 71.2, 9): False
' (Abbey, 92.1, 9) = (Sam, 91.7, 8): False
' (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False
' (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False
' (Abbey, 92.1, 9) = (Serena, 71.2, 9): False
' (Abbey, 92.1, 9) = (Judith, 84.3, 9): False
'
' (Jim, 71.2, 9) = (Sam, 91.7, 8): False
' (Jim, 71.2, 9) = (Sandy, 71.2, 5): True
' (Jim, 71.2, 9) = (Penelope, 82.9, 8): False
' (Jim, 71.2, 9) = (Serena, 71.2, 9): True
' (Jim, 71.2, 9) = (Judith, 84.3, 9): False
'
' (Sam, 91.7, 8) = (Sandy, 71.2, 5): False
' (Sam, 91.7, 8) = (Penelope, 82.9, 8): False
' (Sam, 91.7, 8) = (Serena, 71.2, 9): False
' (Sam, 91.7, 8) = (Judith, 84.3, 9): False
'
' (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False
' (Sandy, 71.2, 5) = (Serena, 71.2, 9): True
' (Sandy, 71.2, 5) = (Judith, 84.3, 9): False
'
' (Penelope, 82.9, 8) = (Serena, 71.2, 9): False
' (Penelope, 82.9, 8) = (Judith, 84.3, 9): False
'
' (Serena, 71.2, 9) = (Judith, 84.3, 9): False
注釈
このメンバーは、明示的なインターフェイス メンバーの実装です。 これは、Tuple<T1,T2,T3> のインスタンスが IStructuralEquatable インターフェイスにキャストされる場合のみ、使用できます。
実装がIEqualityComparer.Equals呼び出されるのは、そうでないnull
場合、およびコンポーネントが現在のインスタンスと同じ型のオブジェクトに正常にキャスト (C#) または変換 (Visual Basic) Tuple<T1,T2,T3> できる場合other
のみです。 メソッドは Tuple<T1,T2,T3>.IStructuralEquatable.Equals まず、実装と Item1 比較するオブジェクトの Tuple<T1,T2,T3> 値を IEqualityComparer.Equals 渡します。 このメソッド呼び出しが返されたtrue
場合は、メソッドが再度呼び出され、2 つのTuple<T1,T2,T3>オブジェクトの値が渡されますItem2。 このメソッド呼び出しが再び返true
された場合、メソッドは 3 回目に呼び出され、2 つのTuple<T1,T2,T3>オブジェクトの値が渡されますItem3。