c# - strings - Ordenar una lista de cadenas numéricamente(1,2,…, 9,10 en lugar de 1,10,2)
ordenar strings c# (3)
Tengo una lista como esta:
var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"};
Si llamo a l.Sort (), la lista se ordena en el orden 1,10,2,3, lo que tiene sentido desde el punto de vista de una cadena pura, pero apesta desde una perspectiva del usuario.
Como no quiero / no puedo forzar a mis usuarios a nombrarlos 01, 02, 03, ... Me pregunto si hay un método incorporado o un algoritmo simple para detectar y clasificar los números correctamente, de modo que tener 1,2,3,10? Como los números solo tienen 1 o 2 caracteres (es decir, no más de 99), posiblemente podría hacer una expresión regular que prefija temporalmente todos los números de 1 dígito con un 0 y una ordenación, pero antes de reinventar la rueda me pregunto si ya existe algo. ?
.net 3.5SP1 si eso importa, no 4.0
¿Por qué no escribir algo que extraiga un número de una cadena como esta?
// Note: This could very well be a bad implementation. I''m not too great with Regex.
static int ExtractNumber(string text)
{
Match match = Regex.Match(text, @"(/d+)");
if (match == null)
{
return 0;
}
int value;
if (!int.TryParse(match.Value, out value))
{
return 0;
}
return value;
}
Entonces podrías ordenar tu lista usando:
list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));
Esto me parece bastante ineficiente, pero al menos debería ser funcional .
El mejor enfoque es hacer uso de IComparer
. Esto ya se ha hecho y se puede encontrar en el proyecto de código .
Podría implementar su propio IComparer que tal vez usa una expresión regular en la entrada ("bla 1.txt"), la convierte en un int, y realiza la comparación en ese valor analizado.