2009-03-18 13 views
5

¿Hay algún soporte de C# incorporado para hacer una clasificación por índice?¿Hay compatibilidad con C# para una ordenación basada en índice?

Más detalles:
Tengo varios juegos de datos almacenados en listas genéricas individuales de doble. Estas listas siempre tienen la misma longitud y contienen elementos de datos correspondientes, pero estas listas aparecen y desaparecen dinámicamente, por lo que no puedo simplemente almacenar los elementos de datos correspondientes en una clase o estructura de forma limpia. (También estoy lidiando con algunos problemas heredados).

Necesito poder ordenar estas llaves desde cualquiera de los conjuntos de datos.

Mi idea de la mejor manera de hacer esto es agregar un nivel de direccionamiento indirecto, y usar una clasificación basada en índice. Tales géneros han estado en uso durante años.

rápida definición de índice basado especie :
marca "índice", una matriz de enteros consecutivos la misma longitud que las listas, entonces el algoritmo de ordenación ordena la lista de números enteros de manera que anylist[index[N]] da el número de ítems de anylist en orden ordenado Las listas en sí nunca se vuelven a ordenar.

¿Hay algún soporte C# incorporado para hacer una clasificación de índice? No he podido encontrarlo ... todo lo que he encontrado reordena la colección en sí. Creo que el apoyo existe, pero aún no he buscado en el lugar correcto.

Estoy usando C# .NET 3.5, en Windows.

Respuesta

12

Una vez que haya configurado la matriz de índice, puede ordenar que el uso de una costumbre Comparison<T> que compara los valores en los artículos correspondientes de la matriz de datos:

Array.Sort<int>(index, (a,b) => anylist[a].CompareTo(anylist[b])); 
+0

¡Guau! Esto es increíble. Hace exactamente lo que necesitaba en una línea. Supongo que esto debe estar utilizando Linq. No lo he estudiado y no sé cómo funciona ... supongo que necesito estudiar un poco. ¡Gracias! –

+1

No, no hay LINQ, pero hay una expresión lambda que se usa comúnmente con LINQ. – Guffa

+2

Y si su matriz no es comparable, es solo una línea más: Comparador comparer = Comparer .Default; Array.Sort (index, (a, b) => comparer.Compare (matriz [a], matriz [b])); –

0

El siguiente código achievs una ordenación indexada. Tenga en cuenta la llamada ToArray() para clonar la matriz de datos. Si se omite, la matriz de datos se clasifica también.

static void Main(String[] args) 
{ 
    Int32[] data = new Int32[] { -6, 6, 5, 4, 1, 2, 3, 0, -1, -2, -3, -4, -5 }; 

    Int32[] indices = Enumerable.Range(0, data.Length).ToArray(); 

    Array.Sort(data.ToArray(), indices); 

    foreach (Int32 index in indices) 
    { 
     Console.Write(String.Format("{0} ", data[index])); 
    } 

    Console.ReadLine(); 
} 

La salida es como se esperaba.

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 
+0

No, eso no es una clasificación por índice, aunque parte del resultado es el mismo que el de una clasificación por índice. – Guffa

+0

Los ítems de los índices se han reordenado para que los datos [índices [i]] para i en 0 a data.length proporcionen los elementos de datos en orden ordenado. Esto es lo que hace un tipo de índice. –

+0

Admito que la forma en que se hace no es realmente inteligente porque los índices se ordenan ordenando una copia de los datos. El resultado es el mismo pero costoso en comparación con su solución si los ítems de datos son grandes. –

Cuestiones relacionadas