Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

viernes, 14 de diciembre de 2012

Aplicando Linq a un array de Estructuras (struct)

Tengo un struct (Estructura) como el que se muestra a continuación (el constructor dentro del struct me permite asignarle valores usando la palabra reservada new):

        private struct misEjes
        {
            public int ejeX;
            public int ejeY;

            public misEjes(int x, int y)
            {
                ejeX = x;
                ejeY = y;
            }
        };

Y luego creo un array del struct misEjes de la forma:

misEjes[] ejes1 = Enumerable.Repeat(new misEjes(0, 0), 10).ToArray();

Usando Linq puedo no sólo declarar el array, si no también definir la cantidad de elementos e inicializarlos. Todo esto lo hace Enumerable.Repeat(). Como éste devuelve un IEnumerable, debo convertirlo con un ToArray(). Para este ejemplo, mi arrray tiene 10 elementos (sus índices van del 0 al 9).

Realizo varias operaciones con los elementos de mi array, y al final deseo quedarme con los que no están repetidos. Para ello hago:

ejes1 = ejes1.Distinct().ToArray();

El Distinct() devuelve todos los elementos que no se repiten. Independientemente los miembros (en este ejemplo ejeX y ejeY) de los elementos del array ejes1 pueden repetirse, pero el conjunto de los miembros de cada elemento de ejes1 (la pareja ejeX y ejeY) debe ser único.

El código completo es:

class Program
    {      
        private struct misEjes
        {
            public int ejeX;
            public int ejeY;

            public misEjes(int x, int y)
            {
                ejeX = x;
                ejeY = y;
            }
        };
       
        static void Main(string[] args)
        {           
            Random rnd = new Random(Convert.ToInt32(DateTime.Now.Millisecond));
           
            misEjes[] ejes1 = Enumerable.Repeat(new misEjes(0, 0), 10).ToArray();
           
            ejes1 =
            ejes1.Select(c=> new misEjes(rnd.Next(0, 4), rnd.Next(0, 3))).ToArray();

            foreach (misEjes em in ejes1)
                Console.WriteLine(String.Concat(em.ejeX, ",", em.ejeY));

            Console.WriteLine(String.Empty);

            ejes1 = ejes1.Distinct().ToArray();

            foreach (misEjes em in ejes1)
                Console.WriteLine(String.Concat(em.ejeX, ",", em.ejeY)); 

            Console.Read(); 
         }
    }

El resultado es:


Las líneas antes del espacio son el array original, las que están después son el array luego de aplicar Distinct(). Nótese cómo las parejas ejeX y ejeY no se repiten.