Pregunta

Tengo una matriz de matrices -. Información acerca de la selección en Excel usando VSTO, donde cada elemento significa la posición inicial y la selección final

Por ejemplo,

int[][] selection = {
new int[] { 1 }, // column A
new int[] { 6 }, // column F
new int[] { 6 }, // column F
new int[] { 8, 9 } // columns H:I
new int[] { 8, 9 } // columns H:I
new int[] { 12, 15 } // columns L:O
};

Podría por favor ayudarme a encontrar una manera, tal vez utilizando métodos LINQ o extensión, para eliminar elementos duplicados? Es decir: F y F, H:I y H:I, etc.

.
¿Fue útil?

Solución

Si desea utilizar una solución LINQ método / pura extensión, a continuación, tendrá que definir su propia implementación de IEqualityComparer para matrices / secuencias. (A menos que me falta algo obvio, no hay conjunto o secuencia preexistente comparador en el BCL). Esto no es terriblemente difícil, sin embargo - he aquí un ejemplo de uno que debe hacer el trabajo bastante bien:

public class SequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
    {
        return Enumerable.SequenceEqual(x, y);
    }

    // Probably not the best hash function for an ordered list, but it should do the job in most cases.
    public int GetHashCode(IEnumerable<T> obj)
    {
        int hash = 0;
        int i = 0;
        foreach (var element in obj)
            hash = unchecked((hash * 37 + hash) + (element.GetHashCode() << (i++ % 16)));
        return hash;
    }
}

La ventaja de esto es que se puede llamar entonces simplemente lo siguiente para quitar las matrices duplicadas.

var result = selection.Distinct(new SequenceEqualityComparer<int>()).ToArray();

Espero que ayude.

Otros consejos

Lo primero que necesita una manera de comparar las matrices de enteros. Para utilizarlo con las clases en el marco, que hace que al hacer una EquailtyComparer. Si las matrices están siempre ordenados, que es bastante fácil de implementar:

public class IntArrayComparer : IEqualityComparer<int[]> {

    public bool Equals(int[] x, int[] y) {
        if (x.Length != y.Length) return false;
        for (int i = 0; i < x.Length; i++) {
            if (x[i] != y[i]) return false;
        }
        return true;
    }

    public int GetHashCode(int[] obj) {
        int code = 0;
        foreach (int value in obj) code ^= value;
        return code;
    }

}

Ahora puede utilizar una matriz de enteros como claves en un HashSet para obtener las matrices singulares:

int[][] selection = {
    new int[] { 1 }, // column A
    new int[] { 6 }, // column F
    new int[] { 6 }, // column F
    new int[] { 8, 9 }, // columns H:I
    new int[] { 8, 9 }, // columns H:I
    new int[] { 12, 15 } // columns L:O
};

HashSet<int[]> arrays = new HashSet<int[]>(new IntArrayComparer());
foreach (int[] array in selection) {
    arrays.Add(array);
}

El HashSet simplemente tira a la basura valores duplicados, por lo que ahora contiene cuatro matrices de enteros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top