閱讀英文

共用方式為


IStructuralEquatable 介面

定義

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

C#
public interface IStructuralEquatable
衍生

範例

默認相等比較子 EqualityComparer<Object>.Default.Equals會將兩 NaN 個值視為相等。 不過,在某些情況下,您可能會想要比較 NaN 相等值以傳回 false,這表示無法比較值。 下列範例定義一個實作 NanComparer 介面的 IEqualityComparer 類別。 第三個範例會使用它做為 Tuple 實作之IStructuralEquatable介面方法的自變數Equals(Object, IEqualityComparer)。 它會使用相等運算符來比較兩 Double 個或兩 Single 個值。 它會將任何其他類型的值傳遞至預設相等比較子。

C#
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);
   }
}

下列範例會建立兩個相同的 3 元組物件,其元件包含三 Double 個值。 第二個元件的值是 Double.NaN。 此範例接著會呼叫 Tuple<T1,T2,T3>.Equals 方法,並呼叫 IStructuralEquatable.Equals 方法三次。 第一次,它會傳遞 屬性所 EqualityComparer<T>.Default 傳回的默認相等比較子。 第二次,它會傳遞 屬性所 StructuralComparisons.StructuralEqualityComparer 傳回的默認相等比較子。 第三次,它會傳遞自定義 NanComparer 物件。 如範例的輸出所示,前三個方法呼叫會傳回 true,而第四個呼叫則會傳 false回 。

C#
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

備註

結構相等表示兩個物件相等,因為它們具有相等值。 它與參考相等不同,這表示兩個對象參考相等,因為它們參考相同的實體物件。 介面 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)

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

適用於

產品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱