ordenar multiple lista descending desc columns ascending asc c# asp.net-mvc linq linq-to-sql sql-order-by

lista - order by linq c# multiple columns



Orderby() no ordena nĂºmeros correctamente c# (12)

Estoy escribiendo una aplicación para mi empresa y actualmente estoy trabajando en la funcionalidad de búsqueda. Cuando un usuario busca un artículo, quiero mostrar la versión más alta (que se almacena en una base de datos).

El problema es que la versión se almacena como una cadena en lugar de int, y cuando hago un OrderBy (q => q.Version) en los resultados, se devuelven como

1 10 11 2 3 ...

Obviamente, 2 viene antes de las 10.

¿Hay alguna manera para que yo lance la versión como un entero o hay un IComparer simple por ahí? No pude encontrar nada sustancial hasta el momento.

Intenté hacer esto:

var items = (from r in results select r).OrderBy(q => Int32.Parse(q.Version));

Esto compila pero no funciona.


¿Por qué clasificas si solo necesitas "la versión más alta"? Parece que podrías evitar un poco de sobrecarga si usabas Max ().

Además, realmente debería cambiar el tipo de columna a entero.


¿Por qué estás ordenando en una lambda? ¿Por qué no solo ordena la consulta?

var query = from r in items orderby int.Parse( r ) select r;

Ahora que sabemos que está utilizando LINQ to SQL, puede considerar hacer una llamada SQL estándar en esta haciendo algo como:

Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol From ...

O incluso

Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol From ... Order By Cast( TextWhichShouldBeIntCol As int )

Eso sangrará en su LINQ como un int (y si usa la segunda iteración, ordene). Eso evita tener que pasar por el conjunto de resultados dos veces en LINQ (una vez para consultar, una para ordenar).


Hay una pieza increíble de código que hace un gran trabajo cuando se trata de clasificación natural. Su nombre es AlphanumComparator .

Código de muestra:

var ordered = Database.Cars.ToList().OrderBy(c => c.ModelString, new AlphanumComparator());

Tenga en cuenta que la lista debe estar en la memoria.

Si obtiene la versión de C #, haga esto:

AlphanumComparator : IComparer<string>

y

public int Compare(string x, string y)


Hice una prueba. tengo el siguiente código.

string[] versions = { "1", "2", "10", "12", "22", "30" }; foreach (var ver in versions.OrderBy(v => v)) { Console.WriteLine(ver); }

Como era de esperarse, el resultado es 1, 10, 12, 2, 22, 30. Luego, cambiemos versions.OrderBy(v => v)) a versions.OrderBy(v => int.Parse(v))) . Y funciona bien: 1, 2, 10, 12, 22, 30

Creo que su problema es que tiene caracteres no distintivos en su cadena como ''.''. ¿Qué tipo de excepción obtienes?



Parece que tiene un valor de texto en lugar de un valor numérico.

Si necesita ordenar, puede intentar:

var items = (from r in results select r); return items.OrderBy( v=> Int.Parse(v.Version) );


Si no puede cambiar la definición de su tabla (por lo que la versión es de tipo numérico) y su consulta realmente está en la lista (no utiliza omisión o toma, o reduce el número de resultados), lo mejor que puede hacer se llama "ToList" en los resultados no ordenados, que cuando aplica un OrderBY lambda tendrá lugar en su código, en lugar de intentar hacerlo en el extremo del servidor SQL (y que ahora debería funcionar).


Tu problema está en otro lado, los siguientes trabajos:

new[] { "1", "10", "2", "3", "11" } .OrderBy(i => int.Parse(i)) .ToList() .ForEach(Console.WriteLine);

Si su problema es LINQ to SQL, entonces lo que está sucediendo es que CLR está tratando de crear SQL fuera de su LINQ y no entiende int.Parse . Lo que puede hacer es obtener primero los datos de SQL y luego ordenarlos una vez que se carguen todos los datos:

var items = (from r in results select r) .ToList() .OrderBy(q => Int32.Parse(q.Version));

Deberías hacerlo.


prueba esto:

var items = results.(Select(v => v).OrderBy(v => v.PadLeft(4));

eso funcionará en Linq2Sql


var items = (from r in results select r).OrderBy(q => Convert.ToInt32(q.Version));

Definitivamente corre ...


var items = (from v in results select v).ToList().OrderBy(x => int.Parse(x.Version));


var query = from r in items let n = int.Parse(r) orderby n select n;