Eventos

[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

No hay comentarios.:

Publicar un comentario

Epicalsoft — Superheroic Software Development Blog Designed by Templateism.com Copyright © 2014

Con tecnología de Blogger.