EqualityComparer<T>.Default Propiedad

Definición

Devuelve un comparador de igualdad predeterminado para el tipo especificado por el argumento genérico.

C#
public static System.Collections.Generic.EqualityComparer<T> Default { get; }

Valor de propiedad

Instancia predeterminada de la clase EqualityComparer<T> para el tipo T.

Ejemplos

En el ejemplo siguiente se crea una colección que contiene elementos del Box tipo y, a continuación, se busca un cuadro que coincida con otro cuadro llamando al FindFirst método dos veces.

La primera búsqueda no especifica ningún comparador de igualdad, lo que significa FindFirst que usa EqualityComparer<T>.Default para determinar la igualdad de cuadros. A su vez, usa la implementación del IEquatable<T>.Equals método en la Box clase . Dos cuadros se consideran iguales si sus dimensiones son iguales.

La segunda búsqueda especifica un comparador de igualdad (BoxEqVolume) que define la igualdad por volumen. Dos cuadros se consideran iguales si sus volúmenes son los mismos.

C#
using System;
using System.Collections.Generic;

static class Program
{
    static void Main()
    {
        var redBox = new Box(8, 8, 4);
        var blueBox = new Box(6, 8, 4);
        var greenBox = new Box(4, 8, 8);

        var boxes = new[] { redBox, blueBox, greenBox };

        var boxToFind = new Box(4, 8, 8);

        var foundByDimension = boxes.FindFirst(boxToFind);

        Console.WriteLine($"Found box {foundByDimension} by dimension.");

        var foundByVolume = boxes.FindFirst(boxToFind, new BoxEqVolume());

        Console.WriteLine($"Found box {foundByVolume} by volume.");
    }
}

public static class CollectionExtensions
{
    public static T FindFirst<T>(
        this IEnumerable<T> collection, T itemToFind, IEqualityComparer<T> comparer = null)
    {
        comparer = comparer ?? EqualityComparer<T>.Default;

        foreach (var item in collection)
        {
            if (comparer.Equals(item, itemToFind))
            {
                return item;
            }
        }

        throw new InvalidOperationException("No matching item found.");
    }
}

public class BoxEqVolume : EqualityComparer<Box>
{
    public override bool Equals(Box b1, Box b2)
    {
        if (object.ReferenceEquals(b1, b2))
            return true;

        if (b1 is null || b2 is null)
            return false;

        return b1.Volume == b2.Volume;
    }

    public override int GetHashCode(Box box) => box.Volume.GetHashCode();
}

public class Box : IEquatable<Box>
{
    public Box(int height, int length, int width)
    {
        this.Height = height;
        this.Length = length;
        this.Width = width;
    }

    public int Height { get; }
    public int Length { get; }
    public int Width { get; }

    public int Volume => Height * Length * Width;

    public bool Equals(Box other)
    {
        if (other is null)
            return false;

        return this.Height == other.Height && this.Length == other.Length
            && this.Width == other.Width;
    }

    public override bool Equals(object obj) => Equals(obj as Box);
    public override int GetHashCode() => (Height, Length, Width).GetHashCode();

    public override string ToString() => $"{Height} x {Length} x {Width}";
}

/* This example produces the following output:
 *
    Found box 4 x 8 x 8 by dimension.
    Found box 8 x 8 x 4 by volume.
 */

Comentarios

La Default propiedad comprueba si el tipo T implementa la System.IEquatable<T> interfaz y, si es así, devuelve un EqualityComparer<T> objeto que usa esa implementación. De lo contrario, devuelve un EqualityComparer<T> objeto que usa las invalidaciones de Object.Equals y Object.GetHashCode proporcionadas por T.

Se aplica a

Producto Versiones
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Consulte también