2012-07-11 9 views
5

Estoy tratando de clasificar los nodos de una vista de árbol con respecto a su propiedad de texto, por supuesto. El problema es que mi clase de comparación no se preocupa por los números. Aquí está el código:Comparación de cadenas para tener en cuenta los números

public class TreeNodeSorter : IComparer 
{ 
    public int Compare(object x, object y) 
    { 
     var tx = x as TreeNode; 
     var ty = y as TreeNode; 

     return string.Compare(tx.Text, ty.Text); 
    } 
} 

Y aquí está el resultado:

enter image description here

El primer nodo hijo (depuración ...) está bien, pero mi problema es qué en la tierra "HBM \ D10 "está ordenada antes de" HBM \ D7 "y así sucesivamente ...

+1

posible duplicado de [Orden de clasificación natural en C#] (http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp) – Jon

Respuesta

0

tener una lectura de http://www.dotnetperls.com/alphanumeric-sorting. Sin embargo, es posible que necesite quitar todo lo demás para que su solución funcione, ya que se ordena numérica o alfabéticamente.

Si se trata de un nombre de archivo dinámico, puede ser mejor utilizar una expresión regular para que coincida con las partes que desea ordenar.

5

Si la portabilidad no es un problema, puede p/invocar StrCmpLogicalW(). Esta función es utilizada por el shell de Windows para ordenar los nombres de archivo que muestra:

public class TreeNodeSorter : IComparer 
{ 
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    static extern int StrCmpLogicalW(string x, string y); 

    public int Compare(object x, object y) 
    { 
     var tx = x as TreeNode; 
     var ty = y as TreeNode; 

     return StrCmpLogicalW(tx.Text, ty.Text); 
    } 
} 
+0

Depende de qué tan 'limpio' de una solución que desea realmente . Las probabilidades son que si implementa las suyas usando el método en DotNetPearls y una expresión regular, probablemente aprenda más y posiblemente reutilice. – Echilon

0

Esto se debe a que el carácter "1" es menor que el carácter "7". Esto se debe a que las cuerdas se comparan un char a la vez.

una solución fácil sería incude acolchado de 0 a begininning de la cadena, como:

D04 
D07 
D10 
D11 

etc ...

0

Si usted tiene un patrón razonable para extraer el número (supongo algo como @ "\ D \ d +") use esto para eliminar el número de su etiqueta, y si la etiqueta es igual, devuelva la diferencia de dos números como comparación.

Cuestiones relacionadas