[C#] ¿Cómo quitar elementos repetidos en una lista?

Existen datos simples y complejos, y por ello hay que tratarlos de diferente manera.

Simples

Si queremos trabajar con los tipos de datos primitivos como el double, int, long, decimal y string no hay que hacer mucho esfuerzo.

            int[] numeros = new int[] { 1, 1, 2, 3, 8, 8, 9 };

foreach (var numero in numeros)
Console.Write(numero);

Console.WriteLine();

foreach (var numero in numeros.Distinct())
Console.Write(numero);

Console.WriteLine();

var numerosSinRepetir = new List<int>();
foreach (var numero in numeros)
if (!numerosSinRepetir.Contains(numero))
numerosSinRepetir.Add(numero);
foreach (var numero in numerosSinRepetir)
Console.Write(numero);

Console.WriteLine();
Console.WriteLine();

Complejos

Si queremos trabajar con clases o estructuras tenemos que implementar la interfaz IEqualityComparer<T> correctamente.


public class DatoComplejo
{
public int Codigo { get; set; }

public DatoComplejo(int codigo)
{
this.Codigo = codigo;
}

public override string ToString()
{
return string.Format("Código: {0}", this.Codigo);
}
}

public class DatoComplejoEqualityComparer : IEqualityComparer<DatoComplejo>
{

public bool Equals(DatoComplejo x, DatoComplejo y)
{
return x.Codigo == y.Codigo;
}

public int GetHashCode(DatoComplejo obj)
{
return obj.Codigo.GetHashCode();
}
}
            DatoComplejo[] datosComplejos = new DatoComplejo[] 
{
new DatoComplejo(1),
new DatoComplejo(1),
new DatoComplejo(2),
new DatoComplejo(3),
new DatoComplejo(8),
new DatoComplejo(8),
new DatoComplejo(9)
};

foreach (var datoComplejo in datosComplejos)
Console.Write(datoComplejo + ". ");

Console.WriteLine();

foreach (var datoComplejo in datosComplejos.Distinct())
Console.Write(datoComplejo + ". ");

Console.WriteLine();

foreach (var datoComplejo in datosComplejos.Distinct(new DatoComplejoEqualityComparer()))
Console.Write(datoComplejo + ". ");

Console.WriteLine();

var datosComplejosSinRepetir = new List<DatoComplejo>();
foreach (var datoComplejo in datosComplejos)
if (!datosComplejosSinRepetir.Contains(datoComplejo, new DatoComplejoEqualityComparer()))
datosComplejosSinRepetir.Add(datoComplejo);
foreach (var datoComplejo in datosComplejosSinRepetir)
Console.Write(datoComplejo + ". ");

Console.WriteLine();
Console.WriteLine();

CodePlex

Código fuente disponible en: CSharp -> LINQDistinct

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *