IStructuralEquatable 介面

定義

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

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

範例

預設相等比較子 EqualityComparer<Object>.Default.Equals ,會將兩 NaN 個值視為相等。 不過,在某些情況下,您可能會想要比較相等的值以傳回 false ,這表示無法比較 NaN 這些值。 下列範例定義一個實作 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也會提供 和 StructuralComparisons.StructuralEqualityComparer 屬性所 EqualityComparer<T>.Default 傳回的預設相等比較子。 如需詳細資訊,請參閱範例。

泛型 Tuple 類別 (Tuple<T1>Tuple<T1,T2>Tuple<T1,T2,T3> 等) ,而 Array 類別會提供介面的 IStructuralEquatable 明確實作。 藉由在 C#) 中轉換 (,或在 Visual) Basic 中將 (轉換成介面值,並將目前的陣列或 Tuple IStructuralEquatable 實例轉換成介面值,並將實 IEqualityComparer 作當做方法的引數 Equals 提供,您可以定義陣列或集合的自訂相等比較。

方法

Equals(Object, IEqualityComparer)

判斷物件與目前的執行個體在結構上是否相等。

GetHashCode(IEqualityComparer)

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

適用於

另請參閱