共用方式為


IStructuralEquatable 介面

定義

定義支援物件之結構相等比較的方法。

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)

傳回目前執行個體的雜湊碼。

適用於

另請參閱