2012-07-11 18 views
5

Sto cercando di ordinare i nodi di una vista ad albero in relazione alla loro proprietà di testo, ovviamente. Il problema è che la mia classe di confronto non si preoccupa dei numeri. Ecco il codice:Confronto tra stringhe per considerare i numeri

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); 
    } 
} 

E qui è il risultato:

enter image description here

Il nodo primo figlio (Debug ...) è ok, ma il mio problema è perché sulla terra "HBM \ D10 "è ordinato prima di" HBM \ D7 "e così via ...

+1

possibile duplicato di [Ordine di ordinamento naturale in C#] (http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp) – Jon

risposta

0

Avere una lettura di http://www.dotnetperls.com/alphanumeric-sorting. Potrebbe essere necessario rimuovere tutto il resto per far funzionare la soluzione, in ordine numerico o alfabetico.

Se si tratta di un nome file dinamico, potrebbe essere preferibile utilizzare un'espressione regolare per abbinare semplicemente le parti che si desidera ordinare.

5

Se la portabilità non è un problema, è possibile p/invocare StrCmpLogicalW(). Questa funzione viene utilizzata dalla shell di Windows per ordinare i nomi dei file che visualizza:

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

Dipende da come "pulire" una soluzione che si desidera veramente . Le probabilità sono, se si implementa il proprio utilizzando il metodo in DotNetPearls e una regex, probabilmente si impara di più e possibilmente riutilizzarlo. – Echilon

0

Questo perché il carattere "1" è inferiore al carattere "7. Questo è perché le stringhe sono confrontate con un char alla volta.

una soluzione semplice sarebbe quella di incude imbottiti 0 di al begininning della stringa, come:

D04 
D07 
D10 
D11 

ecc ...

0

Se si dispone di un modello ragionevole per estrarre il numero (immagino qualcosa come @ "\ D \ d +") utilizzare questo per rimuovere il numero dalla tua etichetta, quindi se l'etichetta è uguale restituire la differenza di due numeri come confronto.