2012-09-13 11 views
13

Me gustaría ordenar mi matriz int en orden ascendente.Ordenar una matriz int con ordenby

primero hago una copia de mi matriz:

int[] copyArray = myArray.ToArray(); 

entonces me gustaría para ordenarla en orden ascendente de esta manera:

int[] sortedCopy = from element in copyArray 
        orderby element ascending select element; 

Pero me sale un error, "seleccionado" recibe highligted y el error es: "no se puede convertir implícitamente el tipo 'system.linq.iorderedenumerable' a 'int []'"

+0

¿Qué estás haciendo ahora con sortedCopy? Quizás no necesites una matriz. – weston

Respuesta

32

Tiene que llamar al ToArray() al final para convertir realmente la secuencia ordenada en una matriz. LINQ usa evaluación diferida, lo que significa que hasta que no llame a ToArray(), ToList() o algún otro método similar, no se realizará el procesamiento intermedio (en este caso, la clasificación).

Haciendo esto, ya hará una copia de los elementos, por lo que no es necesario crear primero su propia copia.

Ejemplo:

int[] sortedCopy = (from element in myArray orderby element ascending select element) 
        .ToArray(); 

tal vez sería preferible escribir esto en sintaxis de la expresión:

int[] sortedCopy = myArray.OrderBy(i => i).ToArray(); 
+1

Muchas gracias Sr. Jon! :) ¿Qué significa "(i => i)"? – user1635406

+9

@ user1635406: 'i => i' es una * función lambda *; describe cómo ordenar la matriz. La primera 'i' significa que se necesita un argumento llamado 'i' (puede elegir cualquier nombre legal); este argumento es un 'int' porque eso es lo que contiene la matriz. La segunda parte es la cantidad que desea ordenar.En este caso, queremos ordenar cada número "como sí mismo", entonces 'i => i'. El 'x => x.Name' en la respuesta de Marc significaría" dado cada elemento 'x', ordenar por' x.Name' ". – Jon

+0

¿no se procesará más rápido si primero haces arreglos y luego haces tu pedido? –

1

No sabemos lo que está haciendo al lado, pero tal vez usted no necesita una matriz. Si va a otro enunciado linq, o foreach, simplemente guárdelo como está, más simplemente usando var.

var sortedCopy = myArray.OrderBy(i => i); 

foreach(var item in sortedCopy) 
{ 
    //print out for example 
} 

Esto permite que linq sea lo más flojo posible. Si siempre emite ToArray o ToList, no tiene más remedio que evaluar en ese momento y asignar memoria para el resultado.

14

Nota: si no necesita una copia (es decir, es aceptable para cambiar myArray), a continuación, un enfoque mucho más simple y más eficiente es simplemente:

Array.Sort(myArray); 

Esto hace un tipo en el lugar de la matriz, explotando el hecho de que es una matriz para ser lo más eficiente posible.

Para los escenarios más complejos (por ejemplo, una especie miembro-racional de un objeto-matriz), puede hacer cosas como:

Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name)); 

esta es la moral equivalente a:

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray(); 

pero de nuevo: haciendo el tipo en el lugar.

+0

Gracias, pero esta vez necesitaba una copia. Intresting leyendo sin embargo. :) – user1635406

Cuestiones relacionadas