Ordenación natural de cadenas

| | Comentarios (0)

Cuando una aplicación funciona, los usuarios se quejan por tonterías... la cosa es quejarse... pero aunque sean tonterías... pueden tener razón.

Una vez se quejaron de que mi aplicación no ordenaba correctamente los números, que el número 10 aparecía antes que el 2... y ales... a explicarles que se estaban ordenando como cadenas en vez de números...

Pues bien... después de investigar un poquito, y ver desesperado de que entre las muchas funcionalidades a la hora de ordenar de .NET no había nada que solucionase mi problema, descubrí varios algoritmos de ordenación, que trataban los números correctamente cuando formaban parte de una cadena. En sourcefrog (ojo no confundir con sourceforge) tienen varias implementaciones para varios lenguajes aunque ninguna para .NET y sitios con implementaciones para .NET descubrí a Sorting Strings Naturally y Numeric String Sort in C# (esta es parcial).

Después descubrí que los Windows XP y 2003 (desconozco los 2000) tienen una función el en propio API para hacer este tipo de ordenación. A la hora de programar suelo seguir la ley del minimisimo esfuerzo, y cuantas menos lineas tenga una función mejor que mejor, por lo que me hice una clase de ordenación para .NET que use la función del api de Windows StrCmpLogicalW

Y es algo así...

public class NaturalComparer : IComparer
{
    [System.Runtime.InteropServices.DllImport(
        "shlwapi.dll",
        CharSet = System.Runtime.InteropServices.CharSet.Unicode,
        ExactSpelling = true,
        SetLastError = false)]
    private static extern int StrCmpLogicalW(string strA, string strB);

    public NaturalComparer()
    { }

    public int Compare(object x, object y)
    {
        if ((x is string) && (y is string))
        {
            return StrCmpLogicalW((string)x, (string)y);
        }
        return -1;
    }
}

Espero que os sea útil!!!

Categorías

Escribir un comentario

Sobre esta entrada

Esta página contiene una sola entrada realizada por Víctor y publicada el 24 de Septiembre 2006 3:26 AM.

String.Format es la entrada anterior en este blog.

Un bookmarklet para descargar videos es la entrada siguiente en este blog.

Encontrará los contenidos recientes en la página principal. Consulte los archivos para ver todos los contenidos.

Publicidad