IEqualityComparer<T> Rozhraní
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Definuje metody pro podporu porovnání objektů pro rovnost.
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 objektů, které chcete porovnat.
Tento parametr typu je kontravariantní. To znamená, že můžete použít buď zadaný typ, nebo libovolný typ, který je méně odvozený. Další informace o kovarianci a kontravarianci najdete v tématu popisujícím kovarianci a kontravarianci u parametrického polymorfismu.- Odvozené
Příklady
Následující příklad přidá vlastní Box
objekty do kolekce slovníku. Objekty Box
jsou považovány za stejné, pokud jsou jejich rozměry stejné.
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.
Poznámky
Toto rozhraní umožňuje implementaci přizpůsobeného porovnání rovnosti pro kolekce. To znamená, že můžete vytvořit vlastní definici rovnosti pro typ T
a určit, že tuto definici použijete s typem kolekce, který přijímá IEqualityComparer<T> obecné rozhraní. V .NET Framework konstruktory Dictionary<TKey,TValue> obecného typu kolekce přijímají toto rozhraní.
Výchozí implementace tohoto rozhraní je poskytována Default vlastností EqualityComparer<T> obecné třídy. Třída StringComparer implementuje IEqualityComparer<T> typ String.
Toto rozhraní podporuje pouze porovnání rovnosti. Přizpůsobení porovnání pro řazení a řazení je poskytováno obecným rozhraním IComparer<T> .
Doporučujeme místo implementace IEqualityComparer<T> rozhraní odvození z EqualityComparer<T> třídy, protože EqualityComparer<T> testy tříd pro rovnost používají metodu IEquatable<T>.Equals Object.Equals místo metody. To je konzistentní s Contains
, , IndexOf``LastIndexOf
a metody Dictionary<TKey,TValue> třídy a Remove
dalších obecných kolekcí.
Metody
Equals(T, T) |
Určuje, zda jsou zadané objekty stejné. |
GetHashCode(T) |
Vrátí kód hash pro zadaný objekt. |