IStructuralEquatable インターフェイス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
オブジェクトの構造が等価かどうかの比較をサポートするメソッドを定義します。
public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
- 派生
例
既定の等値比較子 は、 EqualityComparer<Object>.Default.Equals
2 つの NaN
値が等しいと見なします。 ただし、場合によっては、値の NaN
比較で等値を返 false
す必要がある場合があります。これは、値を比較できないことを示します。 次の例では、 NanComparer
インターフェイスを実装する IEqualityComparer クラスを定義しています。 3 番目の例では、タプルが実装する Equals(Object, IEqualityComparer) インターフェイスの メソッドの IStructuralEquatable 引数として使用されます。 等値演算子を使用して、2 Double つまたは 2 つの Single 値を比較します。 他の型の値を既定の等値比較子に渡します。
using System;
using System.Collections;
using System.Collections.Generic;
public class NanComparer : IEqualityComparer
{
public new bool Equals(object x, object y)
{
if (x is float)
return (float) x == (float) y;
else if (x is double)
return (double) x == (double) y;
else
return EqualityComparer<object>.Default.Equals(x, y);
}
public int GetHashCode(object obj)
{
return EqualityComparer<object>.Default.GetHashCode(obj);
}
}
Imports System.Collections
Imports System.Collections.Generic
Public Class NanComparer : Implements IEqualityComparer
Public Overloads Function Equals(x As Object, y As Object) As Boolean _
Implements IEqualityComparer.Equals
If TypeOf x Is Single Then
Return CSng(x) = CSng(y)
ElseIf TypeOf x Is Double Then
Return CDbl(x) = CDbl(y)
Else
Return EqualityComparer(Of Object).Default.Equals(x, y)
End If
End Function
Public Overloads Function GetHashCode(obj As Object) As Integer _
Implements IEqualityComparer.GetHashCode
Return EqualityComparer(Of Object).Default.GetHashCode(obj)
End Function
End Class
次の例では、3 つの値で構成されるコンポーネントを持つ 2 つの同一の 3 Double タプル オブジェクトを作成します。 2 番目のコンポーネントの値は です Double.NaN。 次に、 メソッドを Tuple<T1,T2,T3>.Equals 呼び出し、 メソッドを IStructuralEquatable.Equals 3 回呼び出します。 初めて、 プロパティによって返される既定の等値比較子を EqualityComparer<T>.Default 渡します。 2 回目は、 プロパティによって返される既定の等値比較子を StructuralComparisons.StructuralEqualityComparer 渡します。 3 回目は、カスタム NanComparer
オブジェクトを渡します。 例の出力に示すように、最初の 3 つのメソッド呼び出しでは が返 true
されますが、4 番目の呼び出しでは が返されます false
。
public class Example
{
public static void Main()
{
var t1 = Tuple.Create(12.3, Double.NaN, 16.4);
var t2 = Tuple.Create(12.3, Double.NaN, 16.4);
// Call default Equals method.
Console.WriteLine(t1.Equals(t2));
IStructuralEquatable equ = t1;
// Call IStructuralEquatable.Equals using default comparer.
Console.WriteLine(equ.Equals(t2, EqualityComparer<object>.Default));
// Call IStructuralEquatable.Equals using
// StructuralComparisons.StructuralEqualityComparer.
Console.WriteLine(equ.Equals(t2,
StructuralComparisons.StructuralEqualityComparer));
// Call IStructuralEquatable.Equals using custom comparer.
Console.WriteLine(equ.Equals(t2, new NanComparer()));
}
}
// The example displays the following output:
// True
// True
// True
// False
Module Example
Public Sub Main()
Dim t1 = Tuple.Create(12.3, Double.NaN, 16.4)
Dim t2 = Tuple.Create(12.3, Double.NaN, 16.4)
' Call default Equals method.
Console.WriteLine(t1.Equals(t2))
Dim equ As IStructuralEquatable = t1
' Call IStructuralEquatable.Equals using default comparer.
Console.WriteLine(equ.Equals(t2, EqualityComparer(Of Object).Default))
' Call IStructuralEquatable.Equals using
' StructuralComparisons.StructuralEqualityComparer.
Console.WriteLine(equ.Equals(t2,
StructuralComparisons.StructuralEqualityComparer))
' Call IStructuralEquatable.Equals using custom comparer.
Console.WriteLine(equ.Equals(t2, New NanComparer))
End Sub
End Module
' The example displays the following output:
' True
' True
' True
' False
注釈
構造の等価性は、2 つのオブジェクトの値が等しいために等しいことを意味します。 これは、2 つのオブジェクト参照が同じ物理オブジェクトを参照しているために等しいことを示す参照の等価性とは異なります。 IStructuralEquatableインターフェイスを使用すると、カスタマイズされた比較を実装して、コレクション オブジェクトの構造の等価性を確認できます。 つまり、構造の等価性の独自の定義を作成し、インターフェイスを受け入れる IStructuralEquatable コレクション型でこの定義を使用することを指定できます。 インターフェイスには、 Equals指定した IEqualityComparer 実装を使用して等価性をテストする という 2 つのメンバーと GetHashCode、等しいオブジェクトに対して同じハッシュ コードを返す という 2 つのメンバーがあります。
注意
インターフェイスでは IStructuralEquatable 、構造の等価性に関するカスタム比較のみがサポートされます。 インターフェイスでは IStructuralComparable 、並べ替えと順序付けのカスタム構造比較がサポートされています。
.NET Framework には、プロパティと StructuralComparisons.StructuralEqualityComparer プロパティによってEqualityComparer<T>.Default返される既定の等値比較子も用意されています。 詳細については、例を参照してください。
ジェネリックのタプルクラス (Tuple<T1>、 Tuple<T1,T2>、Tuple<T1,T2,T3>など)、Arrayクラスの明示的な実装を提供する、IStructuralEquatableインターフェイス。 (C# では) キャストするか、配列またはタプルの現在のインスタンスをインターフェイス値にIStructuralEquatable変換し、 メソッドの引数Equalsとして実装をIEqualityComparer指定することで、配列またはコレクションのカスタム等価比較を定義できます。
メソッド
Equals(Object, IEqualityComparer) |
オブジェクトが現在のインスタンスと構造的に等しいかどうかを判断します。 |
GetHashCode(IEqualityComparer) |
現在のインスタンスのハッシュ コードを返します。 |
適用対象
こちらもご覧ください
.NET