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.
No hay comentarios:
Publicar un comentario