2011-12-19 6 views
7

Sono stato a caccia di una soluzione a questo per un po 'di tempo.IComparer per la cernita naturale

Quando ho ordinare la sottostante utilizzando una stringa sorta Ho un elenco di:

10 
10b 
1111 
1164 
1174 
23 
23A 
23B 
23D 
23E 

voglio veramente la lista sia:

10 
10b 
23 
23A 
23B 
23D 
23E 
1111 
1164 
1174 

Una sorta numerica non fa il lavoro sia .

+0

Perché un ordine numerico non esegue il lavoro? – lahsrah

+5

dai un'occhiata a http://www.codeproject.com/KB/string/NaturalSortComparer.aspx –

+0

@pratapchandra - dovrebbe solo rendere il tuo commento una risposta ufficiale. – Jagd

risposta

4

Se si dispone di LINQ, è possibile utilizzare OrderBy:

Regex digitPart = new Regex(@"^\d+", RegexOptions.Compiled); 
... 
myList.OrderBy(x => int.Parse(digitPart.Match(x).Value)) 
+3

Ha funzionato per me, ma ho dovuto cambiare Integer.Parse in Int32.Parse, e .value dovrebbe essere in maiuscolo. Sintassi, meh ... – Jagd

+0

@Jagd: Oops: P Sono una persona VB.NET ed è 'Integer' lì. – Ryan

+0

Non è chiaro dalla domanda se l'OP vuole una ricerca naturale completa che ordina anche "A1", "A2", "Bumblebee" in questo ordine. –

3
using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

public class NumStrCmp : IComparer<string> { 
    public int Compare(string x, string y){ 
     Regex regex = new Regex(@"(?<NumPart>\d+)(?<StrPart>\D*)",RegexOptions.Compiled); 
     var mx = regex.Match(x); 
     var my = regex.Match(y); 
     var ret = int.Parse(mx.Groups["NumPart"].Value).CompareTo(int.Parse(my.Groups["NumPart"].Value)); 
     if(ret != 0) return ret; 
     return mx.Groups["StrPart"].Value.CompareTo(my.Groups["StrPart"].Value); 
    } 
} 

class Sample { 
    static public void Main(){ 
     var data = new List<string>() {"10","10b","1111","1164","1174","23","23A","23B","23D","23E"}; 
     data.Sort(new NumStrCmp()); 
     foreach(var x in data){ 
      Console.WriteLine(x); 
     } 
    } 
} 
Problemi correlati