IEqualityComparer<T> 接口 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
定义用于支持比较对象是否相等的方法。
generic <typename T>
public interface class IEqualityComparerpublic interface IEqualityComparer<in T>public interface IEqualityComparer<T>type IEqualityComparer<'T> = interfacePublic Interface IEqualityComparer(Of In T)Public Interface IEqualityComparer(Of T)类型参数
- 派生
示例
以下示例将自定义 Box 对象添加到字典集合。 
              Box如果对象的尺寸相同,则视为相等。
using System;
using System.Collections.Generic;
static class Example
{
    static void Main()
    {
        BoxEqualityComparer comparer = new();
        Dictionary<Box, string> boxes = new(comparer);
        AddBox(new Box(4, 3, 4), "red");
        AddBox(new Box(4, 3, 4), "blue");
        AddBox(new Box(3, 4, 3), "green");
        Console.WriteLine($"The dictionary contains {boxes.Count} Box objects.");
        void AddBox(Box box, string name)
        {
            try
            {
                boxes.Add(box, name);
            }
            catch (ArgumentException e)
            {
                Console.WriteLine($"Unable to add {box}: {e.Message}");
            }
        }
    }
}
class Box
{
    public int Height { get; }
    public int Length { get; }
    public int Width { get; }
    public Box(int height, int length, int width)
    {
        Height = height;
        Length = length;
        Width = width;
    }
    public override string ToString() => $"({Height}, {Length}, {Width})";
}
class BoxEqualityComparer : IEqualityComparer<Box>
{
    public bool Equals(Box? b1, Box? b2)
    {
        if (ReferenceEquals(b1, b2))
            return true;
        if (b2 is null || b1 is null)
            return false;
        return b1.Height == b2.Height
            && b1.Length == b2.Length
            && b1.Width == b2.Width;
    }
    public int GetHashCode(Box box) => box.Height ^ box.Length ^ box.Width;
}
// The example displays the following output:
//    Unable to add (4, 3, 4): An item with the same key has already been added.
//    The dictionary contains 2 Box objects.
Imports System.Collections.Generic
Module Example
   Public Sub Main()
      Dim boxEqC As New BoxEqualityComparer()
      Dim boxes As New Dictionary(Of Box, String)(boxEqC)
      Dim redBox = New Box(4, 3, 4)
      AddBox(boxes, redBox, "red")
      Dim blueBox = new Box(4, 3, 4)
      AddBox(boxes, blueBox, "blue")
      Dim greenBox = new Box(3, 4, 3)
      AddBox(boxes, greenBox, "green")
      Console.WriteLine()
      Console.WriteLine("The dictionary contains {0} Box objects.",
                        boxes.Count)
   End Sub
   Private Sub AddBox(dict As Dictionary(Of Box, String), box As Box, name As String)
      Try
         dict.Add(box, name)
      Catch e As ArgumentException
         Console.WriteLine("Unable to add {0}: {1}", box, e.Message)
      End Try
   End Sub
End Module
Public Class Box
    Private _Height As Integer
    Private _Length As Integer
    Private _Width As Integer
    Public Sub New(ByVal h As Integer, ByVal l As Integer,
                                        ByVal w As Integer)
        Me.Height = h
        Me.Length = l
        Me.Width = w
    End Sub
    Public Property Height() As Integer
        Get
            Return _Height
        End Get
        Set(ByVal value As Integer)
            _Height = value
        End Set
    End Property
    Public Property Length() As Integer
        Get
            Return _Length
        End Get
        Set(ByVal value As Integer)
            _Length = value
        End Set
    End Property
    Public Property Width() As Integer
        Get
            Return _Width
        End Get
        Set(ByVal value As Integer)
            _Width = value
        End Set
    End Property
    Public Overrides Function ToString() As String
       Return String.Format("({0}, {1}, {2})", _Height, _Length, _Width)
    End Function
End Class
Class BoxEqualityComparer
    Implements IEqualityComparer(Of Box)
    Public Overloads Function Equals(ByVal b1 As Box, ByVal b2 As Box) _
                   As Boolean Implements IEqualityComparer(Of Box).Equals
        If b1 Is Nothing AndAlso b2 Is Nothing Then
            Return True
        ElseIf b1 Is Nothing Or b2 Is Nothing Then
            Return False
        ElseIf b1.Height = b2.Height AndAlso b1.Length =
                b2.Length AndAlso b1.Width = b2.Width Then
            Return True
        Else
            Return False
        End If
    End Function
    Public Overloads Function GetHashCode(ByVal bx As Box) _
                As Integer Implements IEqualityComparer(Of Box).GetHashCode
        Dim hCode As Integer = bx.Height Xor bx.Length Xor bx.Width
        Return hCode.GetHashCode()
    End Function
End Class
' The example displays the following output:
'    Unable to add (4, 3, 4): An item with the same key has already been added.
'
'    The dictionary contains 2 Box objects.
注解
此接口允许实现集合的自定义相等性比较。 也就是说,可以为 类型 T创建自己的相等性定义,并指定此定义与接受泛型接口的 IEqualityComparer<T> 集合类型一起使用。 在.NET Framework,泛型集合类型的构造函数Dictionary<TKey,TValue>接受此接口。
此接口的默认实现由 Default 泛型类的 EqualityComparer<T> 属性提供。 类 StringComparer 实现 IEqualityComparer<T> 类型 String为 。
此接口仅支持相等比较。 用于排序和排序的比较自定义由 IComparer<T> 泛型接口提供。
建议从 EqualityComparer<T> 类派生,而不是实现 IEqualityComparer<T> 接口,因为 EqualityComparer<T> 类使用 IEquatable<T>.Equals 方法而不是 Object.Equals 方法测试相等性。 这与 Contains类和其他泛型集合的 Dictionary<TKey,TValue> 、IndexOf、 LastIndexOf和 Remove 方法一致。
方法
| Equals(T, T) | 确定指定的对象是否相等。 | 
| GetHashCode(T) | 返回指定对象的哈希代码。 |