IStructuralEquatable 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
定義支援物件之結構相等比較的方法。
public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
- 衍生
範例
默認相等比較子 EqualityComparer<Object>.Default.Equals
會將兩 NaN
個值視為相等。 不過,在某些情況下,您可能會想要比較 NaN
相等值以傳回 false
,這表示無法比較值。 下列範例定義一個實作 NanComparer
介面的 IEqualityComparer 類別。 第三個範例會使用它做為 Tuple 實作之IStructuralEquatable介面方法的自變數Equals(Object, IEqualityComparer)。 它會使用相等運算符來比較兩 Double 個或兩 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 元組物件,其元件包含三 Double 個值。 第二個元件的值是 Double.NaN。 此範例接著會呼叫 Tuple<T1,T2,T3>.Equals 方法,並呼叫 IStructuralEquatable.Equals 方法三次。 第一次,它會傳遞 屬性所 EqualityComparer<T>.Default 傳回的默認相等比較子。 第二次,它會傳遞 屬性所 StructuralComparisons.StructuralEqualityComparer 傳回的默認相等比較子。 第三次,它會傳遞自定義 NanComparer
物件。 如範例的輸出所示,前三個方法呼叫會傳回 true
,而第四個呼叫則會傳 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
備註
結構相等表示兩個物件相等,因為它們具有相等值。 它與參考相等不同,這表示兩個對象參考相等,因為它們參考相同的實體物件。 介面 IStructuralEquatable 可讓您實作自定義的比較,以檢查集合對象的結構是否相等。 也就是說,您可以建立自己的結構相等定義,並指定此定義與接受 介面的 IStructuralEquatable 集合類型搭配使用。 介面有兩個成員: Equals,其會使用指定的 IEqualityComparer 實作來測試是否相等,而 GetHashCode會針對相等的對象傳回相同的哈希碼。
注意
介面 IStructuralEquatable 僅支持結構相等的自定義比較。 介面 IStructuralComparable 支援排序和排序的自定義結構比較。
.NET Framework 也會提供 和 屬性所EqualityComparer<T>.DefaultStructuralComparisons.StructuralEqualityComparer傳回的預設相等比較子。 如需詳細資訊,請參閱範例。
泛型元組類別 (Tuple<T1>、 Tuple<T1,T2>、 Tuple<T1,T2,T3>等) ,而 Array 類別會提供介面的 IStructuralEquatable 明確實作。 藉由在 C#) 中轉換 (或將 Visual) Basic 中的 (轉換成介面值,並將目前的數位或 Tuple IStructuralEquatable 實例轉換成介面值,並提供實 IEqualityComparer 作做為 方法的自變數 Equals ,您可以定義數位或集合的自定義相等比較。
方法
Equals(Object, IEqualityComparer) |
判斷物件與目前的執行個體在結構上是否相等。 |
GetHashCode(IEqualityComparer) |
傳回目前執行個體的雜湊碼。 |