IStructuralEquatable 接口
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
定义用于支持比较对象是否在结构上相等的方法。
public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
- 派生
示例
默认相等比较器 EqualityComparer<Object>.Default.Equals
认为两个 NaN
值相等。 但是,在某些情况下,你可能希望相等值的 NaN
比较返回 false
,这表示无法比较这些值。 下面的示例定义一个实现 NanComparer
接口的 IEqualityComparer 类。 第三个示例使用它作为元组实现的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>.Default 和 StructuralComparisons.StructuralEqualityComparer 属性返回。 有关详细信息,请参阅此示例。
泛型元组类 (Tuple<T1>、 Tuple<T1,T2>、 Tuple<T1,T2,T3>等) ,类 Array 提供接口的 IStructuralEquatable 显式实现。 通过在 C# ) 中强制转换 (或在 Visual Basic 中将 () 数组或元组的当前实例转换为IStructuralEquatable接口值,并将实现作为方法的参数Equals提供IEqualityComparer,可以定义数组或集合的自定义相等性比较。
方法
Equals(Object, IEqualityComparer) |
确定某个对象与当前实例在结构上是否相等。 |
GetHashCode(IEqualityComparer) |
返回当前实例的哈希代码。 |