Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método Enumerable.Distinct<TSource>(IEnumerable<TSource>)

 

Publicado: octubre de 2016

Devuelve diversos elementos de una secuencia utilizando el comparador de igualdad predeterminado para comparar valores.

Espacio de nombres:   System.Linq
Ensamblado:  System.Core (en System.Core.dll)

public static IEnumerable<TSource> Distinct<TSource>(
	this IEnumerable<TSource> source
)

Parámetros

source
Type: System.Collections.Generic.IEnumerable<TSource>

Secuencia de la que se van a quitar los elementos duplicados.

Valor devuelto

Type: System.Collections.Generic.IEnumerable<TSource>

Un IEnumerable<T> que contiene diversos elementos de la secuencia de origen.

Parámetros de tipo

TSource

Tipo de los elementos de source.

Exception Condition
ArgumentNullException

El valor de source es null.

Este método se implementa mediante la ejecución diferida. El valor devuelto inmediato es un objeto que almacena toda la información necesaria para realizar la acción. La consulta representada por este método no se ejecuta hasta que se enumera el objeto llamando a su GetEnumerator método directamente o mediante foreach en Visual C# o For Each en Visual Basic.

El Distinct<TSource>(IEnumerable<TSource>) método devuelve una secuencia desordenada que no contiene valores duplicados. Utiliza el comparador de igualdad predeterminado, Default, para comparar valores.

En Visual Basic sintaxis de expresiones de consulta un Distinct cláusula se convierte en una invocación de Distinct<TSource>.

El comparador de igualdad predeterminado, Default, se utiliza para comparar los valores de los tipos que implementan la IEquatable<T> interfaz genérica. Para comparar un tipo de datos personalizado, debe implementar esta interfaz y proporcionar sus propios GetHashCode y Equals métodos para el tipo.

Para obtener un ejemplo que utiliza IEqualityComparer<T>para definir un comparador personalizado, consulte Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>).

En el ejemplo de código siguiente se muestra cómo utilizar Distinct<TSource>(IEnumerable<TSource>) para devolver distintos elementos de una secuencia de enteros.

List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };

IEnumerable<int> distinctAges = ages.Distinct();

Console.WriteLine("Distinct ages:");

foreach (int age in distinctAges)
{
    Console.WriteLine(age);
}

/*
 This code produces the following output:

 Distinct ages:
 21
 46
 55
 17
*/

Si desea devolver distintos elementos de secuencias de objetos de algún tipo de datos personalizado, debe implementar la IEquatable<T> interfaz genérica de la clase. En el ejemplo de código siguiente se muestra cómo implementar esta interfaz en un tipo de datos personalizado y proporcionar GetHashCode y Equals métodos.

public class Product : IEquatable<Product>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(Product other)
    {

        //Check whether the compared object is null. 
        if (Object.ReferenceEquals(other, null)) return false;

        //Check whether the compared object references the same data. 
        if (Object.ReferenceEquals(this, other)) return true;

        //Check whether the products' properties are equal. 
        return Code.Equals(other.Code) && Name.Equals(other.Name);
    }

    // If Equals() returns true for a pair of objects  
    // then GetHashCode() must return the same value for these objects. 

    public override int GetHashCode()
    {

        //Get hash code for the Name field if it is not null. 
        int hashProductName = Name == null ? 0 : Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashProductCode = Code.GetHashCode();

        //Calculate the hash code for the product. 
        return hashProductName ^ hashProductCode;
    }
}

Después de implementar esta interfaz, puede utilizar una secuencia de Product objetos en el Distinct<TSource>(IEnumerable<TSource>) método, tal como se muestra en el ejemplo siguiente.

Product[] products = { new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "orange", Code = 4 }, 
                       new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "lemon", Code = 12 } };

//Exclude duplicates.

IEnumerable<Product> noduplicates =
    products.Distinct();

foreach (var product in noduplicates)
    Console.WriteLine(product.Name + " " + product.Code);

/*
    This code produces the following output:
    apple 9 
    orange 4
    lemon 12
*/

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 3.5
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: