IEqualityComparer<T> 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
定義支援物件之相等比較的方法。
generic <typename T>
public interface class IEqualityComparer
public interface IEqualityComparer<in T>
public interface IEqualityComparer<T>
type IEqualityComparer<'T> = interface
Public 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) |
傳回指定物件的雜湊碼。 |