IStructuralEquatable 接口

定义

定义用于支持比较对象是否在结构上相等的方法。

public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
派生

示例

默认相等比较器 EqualityComparer<Object>.Default.Equals将两 NaN 个值视为相等。 但是,在某些情况下,你可能希望对 NaN 相等值进行比较, false这表示无法比较这些值。 下面的示例定义一个实现 NanComparer 接口的 IEqualityComparer 类。 第三个 Equals(Object, IEqualityComparer) 示例用作元组实现的 IStructuralEquatable 接口方法的参数。 它通过使用相等运算符比较两 DoubleSingle 值。 它将任何其他类型的值传递给默认相等比较器。

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

以下示例创建两个相同的三元组对象,其组件由三 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) 数组或元组的当前实例中将 (转换为接口值,并将实现作为参数Equals提供给IStructuralEquatableIEqualityComparer方法,可以定义数组或集合的自定义相等比较。

方法

Equals(Object, IEqualityComparer)

确定某个对象与当前实例在结构上是否相等。

GetHashCode(IEqualityComparer)

返回当前实例的哈希代码。

适用于

另请参阅