EqualityComparer<T> Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt eine Basisklasse für Implementierungen der generischen IEqualityComparer<T>-Schnittstelle bereit.
generic <typename T>
public ref class EqualityComparer abstract : System::Collections::Generic::IEqualityComparer<T>, System::Collections::IEqualityComparer
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
[System.Serializable]
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
type EqualityComparer<'T> = class
interface IEqualityComparer<'T>
interface IEqualityComparer
[<System.Serializable>]
type EqualityComparer<'T> = class
interface IEqualityComparer
interface IEqualityComparer<'T>
Public MustInherit Class EqualityComparer(Of T)
Implements IEqualityComparer, IEqualityComparer(Of T)
Typparameter
- T
Der Typ der zu vergleichenden Objekte.
- Vererbung
-
EqualityComparer<T>
- Attribute
- Implementiert
Beispiele
Im folgenden Beispiel wird eine Wörterbuchauflistung von Objekten vom Typ Box
mit einem Gleichheitsvergleich erstellt. Zwei Felder gelten als gleich, wenn ihre Abmessungen identisch sind. Anschließend werden die Felder der Auflistung hinzugefügt.
Das Wörterbuch wird mit einem Gleichheitsvergleich neu erstellt, der Gleichheit auf eine andere Weise definiert: Zwei Felder gelten als gleich, wenn ihre Volumes identisch sind.
using System;
using System.Collections.Generic;
class Program
{
static Dictionary<Box, String> boxes;
static void Main()
{
BoxSameDimensions boxDim = new BoxSameDimensions();
boxes = new Dictionary<Box, string>(boxDim);
Console.WriteLine("Boxes equality by dimensions:");
Box redBox = new Box(8, 4, 8);
Box greenBox = new Box(8, 6, 8);
Box blueBox = new Box(8, 4, 8);
Box yellowBox = new Box(8, 8, 8);
AddBox(redBox, "red");
AddBox(greenBox, "green");
AddBox(blueBox, "blue");
AddBox(yellowBox, "yellow");
Console.WriteLine();
Console.WriteLine("Boxes equality by volume:");
BoxSameVolume boxVolume = new BoxSameVolume();
boxes = new Dictionary<Box, string>(boxVolume);
Box pinkBox = new Box(8, 4, 8);
Box orangeBox = new Box(8, 6, 8);
Box purpleBox = new Box(4, 8, 8);
Box brownBox = new Box(8, 8, 4);
AddBox(pinkBox, "pink");
AddBox(orangeBox, "orange");
AddBox(purpleBox, "purple");
AddBox(brownBox, "brown");
}
public static void AddBox(Box bx, string name)
{
try
{
boxes.Add(bx, name);
Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}",
name, boxes.Count.ToString(), bx.GetHashCode());
}
catch (ArgumentException)
{
Console.WriteLine("A box equal to {0} is already in the collection.", name);
}
}
}
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; }
}
class BoxSameDimensions : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (b1 == null && b2 == null)
return true;
else if (b1 == null || b2 == null)
return false;
return (b1.Height == b2.Height &&
b1.Length == b2.Length &&
b1.Width == b2.Width);
}
public override int GetHashCode(Box bx)
{
int hCode = bx.Height ^ bx.Length ^ bx.Width;
return hCode.GetHashCode();
}
}
class BoxSameVolume : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (b1 == null && b2 == null)
return true;
else if (b1 == null || b2 == null)
return false;
return (b1.Height * b1.Width * b1.Length ==
b2.Height * b2.Width * b2.Length);
}
public override int GetHashCode(Box bx)
{
int hCode = bx.Height * bx.Length * bx.Width;
return hCode.GetHashCode();
}
}
/* This example produces an output similar to the following:
*
Boxes equality by dimensions:
Added red, Count = 1, HashCode = 46104728
Added green, Count = 2, HashCode = 12289376
A box equal to blue is already in the collection.
Added yellow, Count = 3, HashCode = 43495525
Boxes equality by volume:
Added pink, Count = 1, HashCode = 55915408
Added orange, Count = 2, HashCode = 33476626
A box equal to purple is already in the collection.
A box equal to brown is already in the collection.
*
*/
'Imports System.Collections
Imports System.Collections.Generic
Module Program
Dim boxes As Dictionary(Of Box, [String])
Public Sub Main(ByVal args As String())
Dim boxDim As New BoxSameDimensions()
boxes = New Dictionary(Of Box, String)(boxDim)
Console.WriteLine("Boxes equality by dimensions:")
Dim redBox As New Box(8, 4, 8)
Dim greenBox As New Box(8, 6, 8)
Dim blueBox As New Box(8, 4, 8)
Dim yellowBox As New Box(8, 8, 8)
AddBox(redBox, "red")
AddBox(greenBox, "green")
AddBox(blueBox, "blue")
AddBox(yellowBox, "yellow")
Console.WriteLine()
Console.WriteLine("Boxes equality by volume:")
Dim boxVolume As New BoxSameVolume()
boxes = New Dictionary(Of Box, String)(boxVolume)
Dim pinkBox As New Box(8, 4, 8)
Dim orangeBox As New Box(8, 6, 8)
Dim purpleBox As New Box(4, 8, 8)
Dim brownBox As New Box(8, 8, 4)
AddBox(pinkBox, "pink")
AddBox(orangeBox, "orange")
AddBox(purpleBox, "purple")
AddBox(brownBox, "brown")
End Sub
Public Sub AddBox(ByVal bx As Box, ByVal name As String)
Try
boxes.Add(bx, name)
Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}", _
name, boxes.Count.ToString(), bx.GetHashCode())
Catch generatedExceptionName As ArgumentException
Console.WriteLine("A box equal to {0} is already in the collection.", name)
End Try
End Sub
End Module
Public Class Box
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
Private _Height As Integer
Public Property Height() As Integer
Get
Return _Height
End Get
Set(ByVal value As Integer)
_Height = value
End Set
End Property
Private _Length As Integer
Public Property Length() As Integer
Get
Return _Length
End Get
Set(ByVal value As Integer)
_Length = value
End Set
End Property
Private _Width As Integer
Public Property Width() As Integer
Get
Return _Width
End Get
Set(ByVal value As Integer)
_Width = value
End Set
End Property
End Class
Class BoxSameDimensions : Inherits EqualityComparer(Of Box)
Public Overloads Overrides Function Equals(ByVal b1 As Box, _
ByVal b2 As Box) As Boolean
If b1 Is Nothing AndAlso b2 Is Nothing Then
Return True
Else If b1 Is Nothing OrElse b2 Is Nothing Then
Return False
End If
Return (b1.Height = b2.Height AndAlso b1.Length = b2.Length _
AndAlso b1.Width = b2.Width)
End Function
Public Overloads Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height Xor bx.Length Xor bx.Width
Return hCode.GetHashCode()
End Function
End Class
Class BoxSameVolume : Inherits EqualityComparer(Of Box)
Public Overloads Overrides Function Equals(ByVal b1 As Box, _
ByVal b2 As Box) As Boolean
If b1 Is Nothing AndAlso b2 Is Nothing Then
Return True
Else If b1 Is Nothing OrElse b2 Is Nothing Then
Return False
End If
Return (b1.Height * b1.Width * b1.Length = _
b2.Height * b2.Width * b2.Length)
End Function
Public Overloads Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height * bx.Length * bx.Width
Return hCode.GetHashCode()
End Function
End Class
' This example produces an output similar to the following:
' *
' Boxes equality by dimensions:
' Added red, Count = 1, HashCode = 46104728
' Added green, Count = 2, HashCode = 12289376
' A box equal to blue is already in the collection.
' Added yellow, Count = 3, HashCode = 43495525
'
' Boxes equality by volume:
' Added pink, Count = 1, HashCode = 55915408
' Added orange, Count = 2, HashCode = 33476626
' A box equal to purple is already in the collection.
' A box equal to brown is already in the collection.
' *
'
Hinweise
Von dieser Klasse ableiten, um eine benutzerdefinierte Implementierung der generischen Schnittstelle für die IEqualityComparer<T> Verwendung mit Auflistungsklassen wie der Dictionary<TKey,TValue> generischen Klasse oder mit Methoden wie List<T>.Sortbereitzustellen.
Die Default -Eigenschaft überprüft, ob der Typ T
die System.IEquatable<T> generische Schnittstelle implementiert, und gibt, falls ja, ein EqualityComparer<T> zurück, das die Implementierung der IEquatable<T>.Equals Methode aufruft. Andernfalls wird ein EqualityComparer<T>zurückgegeben, wie von T
bereitgestellt.
In .NET 8 und höheren Versionen wird empfohlen, die EqualityComparer<T>.Create(Func<T,T,Boolean>, Func<T,Int32>) -Methode zum Erstellen von Instanzen dieses Typs zu verwenden.
Konstruktoren
EqualityComparer<T>() |
Initialisiert eine neue Instanz der EqualityComparer<T>-Klasse. |
Eigenschaften
Default |
Gibt für den vom generischen Argument angegebenen Typ einen Standardgleichheitsvergleich zurück. |
Methoden
Create(Func<T,T,Boolean>, Func<T,Int32>) |
Erstellt ein EqualityComparer<T> , indem die angegebenen Delegaten als Implementierung der Vergleichs Equals(T, T) - und GetHashCode(T) -Methoden verwendet werden. |
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
Equals(T, T) |
Ermittelt beim Überschreiben in einer abgeleiteten Klasse, ob zwei Objekte vom Typ |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetHashCode(T) |
Dient beim Überschreiben in einer abgeleiteten Klasse für das angegebene Objekt als Hashfunktion für Hashalgorithmen und Datenstrukturen wie Hashtabellen. |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
IEqualityComparer.Equals(Object, Object) |
Bestimmt, ob die angegebenen Objekte gleich sind. |
IEqualityComparer.GetHashCode(Object) |
Gibt einen Hashcode für das angegebene Objekt zurück. |