IEqualityComparer<T> Interfejs
Definicja
Definiuje metody do obsługi porównania obiektów pod kątem równości.Defines methods to support the comparison of objects for equality.
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)
Parametry typu
- T
Typ obiektów do porównania.The type of objects to compare.
Ten parametr typu jest kontrawariantny. Oznacza to, że możesz użyć typu, który został przez Ciebie określony, lub dowolnego typu, który jest mniej pochodny. Aby uzyskać więcej informacji o kowariancji i kontrawariancji, zobacz Kowariancja i kontrawariancja w typach ogólnych.- Pochodne
Przykłady
Poniższy przykład dodaje obiekty niestandardowe Box
do kolekcji słowników.The following example adds custom Box
objects to a dictionary collection. Box
Obiekty są uważane za równe, jeśli ich wymiary są takie same.The Box
objects are considered equal if their dimensions are the same.
using System;
using System.Collections.Generic;
class Example
{
static void Main()
{
BoxEqualityComparer boxEqC = new BoxEqualityComparer();
var boxes = new Dictionary<Box, string>(boxEqC);
var redBox = new Box(4, 3, 4);
AddBox(boxes, redBox, "red");
var blueBox = new Box(4, 3, 4);
AddBox(boxes, blueBox, "blue");
var greenBox = new Box(3, 4, 3);
AddBox(boxes, greenBox, "green");
Console.WriteLine();
Console.WriteLine("The dictionary contains {0} Box objects.",
boxes.Count);
}
private static void AddBox(Dictionary<Box, String> dict, Box box, String name)
{
try {
dict.Add(box, name);
}
catch (ArgumentException e) {
Console.WriteLine("Unable to add {0}: {1}", box, e.Message);
}
}
}
public class Box
{
public Box(int h, int l, int w)
{
this.Height = h;
this.Length = l;
this.Width = w;
}
public int Height { get; set; }
public int Length { get; set; }
public int Width { get; set; }
public override String ToString()
{
return String.Format("({0}, {1}, {2})", Height, Length, Width);
}
}
class BoxEqualityComparer : IEqualityComparer<Box>
{
public bool Equals(Box b1, Box b2)
{
if (b2 == null && b1 == null)
return true;
else if (b1 == null || b2 == null)
return false;
else if(b1.Height == b2.Height && b1.Length == b2.Length
&& b1.Width == b2.Width)
return true;
else
return false;
}
public int GetHashCode(Box bx)
{
int hCode = bx.Height ^ bx.Length ^ bx.Width;
return hCode.GetHashCode();
}
}
// 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.
Uwagi
Ten interfejs umożliwia implementację dostosowanego porównania równości dla kolekcji.This interface allows the implementation of customized equality comparison for collections. Oznacza to, że można utworzyć własną definicję równości dla typu T
i określić, że ta definicja ma być używana z typem kolekcji akceptującym IEqualityComparer<T> interfejs ogólny.That is, you can create your own definition of equality for type T
, and specify that this definition be used with a collection type that accepts the IEqualityComparer<T> generic interface. W .NET Framework konstruktory Dictionary<TKey,TValue> typu kolekcji ogólnej akceptują ten interfejs.In the .NET Framework, constructors of the Dictionary<TKey,TValue> generic collection type accept this interface.
Domyślna implementacja tego interfejsu jest udostępniana przez Default Właściwość EqualityComparer<T> klasy generycznej.A default implementation of this interface is provided by the Default property of the EqualityComparer<T> generic class. StringComparerImplementacja klasy IEqualityComparer<T> typu String .The StringComparer class implements IEqualityComparer<T> of type String.
Ten interfejs obsługuje tylko porównania równości.This interface supports only equality comparisons. Dostosowanie porównań do sortowania i porządkowania jest udostępniane przez IComparer<T> interfejs ogólny.Customization of comparisons for sorting and ordering is provided by the IComparer<T> generic interface.
Firma Microsoft zaleca, aby dziedziczyć z EqualityComparer<T> klasy zamiast implementować IEqualityComparer<T> interfejs, ponieważ EqualityComparer<T> Klasa sprawdza równość przy użyciu IEquatable<T>.Equals metody zamiast Object.Equals metody.We recommend that you derive from the EqualityComparer<T> class instead of implementing the IEqualityComparer<T> interface, because the EqualityComparer<T> class tests for equality using the IEquatable<T>.Equals method instead of the Object.Equals method. Jest to zgodne z Contains
IndexOf
LastIndexOf
metodami,, i Remove
Dictionary<TKey,TValue> klasy i innymi kolekcjami ogólnymi.This is consistent with the Contains
, IndexOf
, LastIndexOf
, and Remove
methods of the Dictionary<TKey,TValue> class and other generic collections.
Metody
Equals(T, T) |
Określa, czy określone obiekty są równe.Determines whether the specified objects are equal. |
GetHashCode(T) |
Zwraca kod skrótu dla określonego obiektu.Returns a hash code for the specified object. |