Estoy tratando de ordenar una matriz de números que son cadenas y me gustaría que se ordenaran numéricamente.
El problema es que no puedo convertir los números en int .
Aquí está el código:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
salida: 101, 102, 103, 105, 90
Me gustaría: 90, 101, 102, 103, 105
EDITAR: La salida no puede ser 090, 101, 102 ...
Se actualizó la muestra de código para que diga "cosas" en lugar de "tamaños". La matriz puede ser algo como esto:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
Eso significa que debe ordenarse alfabéticamente y por número:
007, 90, bob lauren, paul
image10
venir despuésimage2
? ¿DeberíaJanuary
venir antesFebruary
?Respuestas:
Pase un comparador personalizado a OrderBy. Enumerable.OrderBy le permitirá especificar cualquier comparador que desee.
Esta es una forma de hacerlo:
fuente
IsNumeric
método es malo, una codificación impulsada por excepciones siempre es mala. Úselo en suint.TryParse
lugar. Pruebe su código con una lista grande y le llevará una eternidad.Simplemente rellene con ceros de la misma longitud:
fuente
sizes
tampoco funcionaría, porque el resultado es de un tipo diferente. La respuesta es un tanto abreviada, ya que la segunda línea muestra el resultado como una expresión, pero depende del lector hacer algo con él. Agregué otra asignación de variable para que quede más claro.Y, que tal esto ...
fuente
"b", "ab", "101", "103", "bob", "abcd"
.El valor es una cadena
Trabajos
fuente
string[] { "Object 1", "Object 9", "Object 14" }
"b", "ab", "101", "103", "bob", "abcd"
.Hay una función nativa en Windows
StrCmpLogicalW
que comparará en cadenas números como números en lugar de letras. Es fácil hacer un comparador que llame a esa función y la use para sus comparaciones.Incluso funciona en cadenas que tienen texto y números. Aquí hay un programa de ejemplo que mostrará la diferencia entre la clasificación predeterminada y la
StrCmpLogicalW
clasificaciónque salidas
fuente
-1 0 10 2
está ordenado como0 -1 2 10
prueba esto
Nota: esto será útil cuando todas las cadenas sean convertibles a int .....
fuente
ToList()
antes =>sizes.ToList().OrderBy(x => Convert.ToInt32(x))
Supongo que esto será mucho más bueno si tiene algo numérico en la cadena. Espero que te ayude.
PD: no estoy seguro sobre el rendimiento o los valores de cadena complicados, pero funcionó bien algo como esto:
lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21
fuente
Dice que no puede convertir los números en int porque la matriz puede contener elementos que no se pueden convertir a int, pero no hay nada de malo en intentarlo:
Luego compare así:
Salida: 007, 90, 90, 101, 102, 103, 105, bob, lauren, paul
fuente
Esto parece una solicitud extraña y merece una solución extraña:
fuente
Este sitio analiza la clasificación alfanumérica y clasificará los números en un sentido lógico en lugar de en un sentido ASCII. También tiene en cuenta los alfas que lo rodean:
http://www.dotnetperls.com/alphanumeric-sorting
EJEMPLO:
El código es el siguiente:
fuente
La respuesta dada por Jeff Paulsen es correcta pero
Comprarer
se puede simplificar mucho a esto:Esto funciona porque lo único que se comprueba para el resultado de
Comparer
es si el resultado es mayor, menor o igual a cero. Uno puede simplemente restar los valores de otro y no tiene que manejar los valores de retorno.Además, el
IsNumeric
método no debería tener que usar untry
bloque y puede beneficiarse deTryParse
.Y para aquellos que no están seguros: este Comparer ordenará los valores de modo que los valores no numéricos siempre se agreguen al final de la lista. Si uno los quiere al principio, el segundo y tercer
if
bloque deben intercambiarse.fuente
Prueba esto :
fuente
arr = arr.OrderBy (x => x, nuevo NaturalSort ()). ToArray ();
La razón por la que lo necesitaba era archivarme en un directorio cuyos nombres de archivo comenzaran con un número:
fuente
Ahora ordene las listas y vuelva a fusionarlas ...
Intenté hacer una contribución en esta interesante pregunta ...
fuente
Mi solución preferida (si todas las cadenas son solo numéricas):
fuente
fuente
Ampliando la respuesta de Jeff Paulsen. Quería asegurarme de que no importara cuántos grupos de caracteres o números hubiera en las cadenas:
También tomé SplitCharsAndNums de una página SO después de enmendarla para tratar con nombres de archivos.
fuente
Aunque esta es una pregunta antigua, me gustaría dar una solución:
Woha bastante simple ¿verdad? :RE
fuente
fuente