EqualityComparer<T> Klass

Definition

Tillhandahåller en basklass för implementeringar av det IEqualityComparer<T> allmänna gränssnittet.

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)

Typparametrar

T

Vilken typ av objekt som ska jämföras.

Arv
EqualityComparer<T>
Attribut
Implementeringar

Exempel

I följande exempel skapas en ordlistesamling med objekt av typen Box med en likhetsjämförare. Två rutor anses vara lika om deras dimensioner är desamma. Sedan läggs rutorna till i samlingen.

Ordlistan återskapas med en likhetsjämförare som definierar likhet på ett annat sätt: Två rutor anses vara lika om deras volymer är desamma.

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.
' * 
'

Kommentarer

Härled från den här klassen för att tillhandahålla en anpassad implementering av det IEqualityComparer<T> generiska gränssnittet för användning med samlingsklasser som den Dictionary<TKey,TValue> generiska klassen eller med metoder som List<T>.Sort.

Egenskapen Default kontrollerar om typen T implementerar det System.IEquatable<T> allmänna gränssnittet och returnerar i så fall en EqualityComparer<T> som anropar implementeringen av IEquatable<T>.Equals metoden. Annars returneras en EqualityComparer<T>, enligt .T

I .NET 8 och senare versioner rekommenderar vi att du använder metoden EqualityComparer<T>.Create(Func<T,T,Boolean>, Func<T,Int32>) för att skapa instanser av den här typen.

Konstruktorer

Name Description
EqualityComparer<T>()

Initierar en ny instans av EqualityComparer<T> klassen.

Egenskaper

Name Description
Default

Returnerar en standardjämlikhetsjämförare för den typ som anges av det allmänna argumentet.

Metoder

Name Description
Create(Func<T,T,Boolean>, Func<T,Int32>)

Skapar en EqualityComparer<T> med hjälp av de angivna ombuden som implementering av jämförelsen Equals(T, T) och GetHashCode(T) metoderna.

Equals(Object)

Avgör om det angivna objektet är lika med det aktuella objektet.

(Ärvd från Object)
Equals(T, T)

När åsidosättas i en härledd klass avgör om två objekt av typen T är lika.

GetHashCode()

Fungerar som standard-hash-funktion.

(Ärvd från Object)
GetHashCode(T)

När det åsidosättas i en härledd klass fungerar den som en hash-funktion för det angivna objektet för hash-algoritmer och datastrukturer, till exempel en hash-tabell.

GetType()

Hämtar den aktuella instansen Type .

(Ärvd från Object)
MemberwiseClone()

Skapar en ytlig kopia av den aktuella Object.

(Ärvd från Object)
ToString()

Returnerar en sträng som representerar det aktuella objektet.

(Ärvd från Object)

Explicita gränssnittsimplementeringar

Name Description
IEqualityComparer.Equals(Object, Object)

Avgör om de angivna objekten är lika med.

IEqualityComparer.GetHashCode(Object)

Returnerar en hash-kod för det angivna objektet.

Gäller för

Se även