IEqualityComparer<T> Gränssnitt
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Definierar metoder som stöder jämförelse av objekt för likhet.
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)
Typparametrar
- T
Vilken typ av objekt som ska jämföras.
Det här är en contravariant-typparameter. Det innebär att du kan använda antingen den typ du angett eller en typ som inte är lika härledd. Mer information om kovarians och kontravarians finns i Kovarians och kontravarians i Generisk typ.- Härledda
Exempel
I följande exempel läggs anpassade Box objekt till i en ordlistesamling. Objekten Box anses vara lika om deras dimensioner är desamma.
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.
Kommentarer
Med det här gränssnittet kan du implementera anpassade likhetsjämförelser för samlingar. Du kan alltså skapa en egen definition av likhet för typen Toch ange att den här definitionen ska användas med en samlingstyp som accepterar det IEqualityComparer<T> allmänna gränssnittet. I .NET Framework accepterar konstruktorer av den allmänna samlingstypen Dictionary<TKey,TValue> det här gränssnittet.
En standardimplementering av det här gränssnittet tillhandahålls av Default egenskapen för den EqualityComparer<T> generiska klassen. Klassen StringComparer implementerar IEqualityComparer<T> av typen String.
Det här gränssnittet stöder endast likhetsjämförelser. Anpassning av jämförelser för sortering och ordning tillhandahålls av det IComparer<T> allmänna gränssnittet.
Vi rekommenderar att du härleder från EqualityComparer<T> klassen i stället för att implementera IEqualityComparer<T> gränssnittet, eftersom klasstesterna EqualityComparer<T> för likhet med metoden IEquatable<T>.Equals i stället för Object.Equals metoden. Detta överensstämmer med Containsmetoderna , IndexOf, LastIndexOfoch Remove för Dictionary<TKey,TValue> klassen och andra generiska samlingar.
Metoder
| Name | Description |
|---|---|
| Equals(T, T) |
Avgör om de angivna objekten är lika med. |
| GetHashCode(T) |
Returnerar en hash-kod för det angivna objektet. |