2011-12-19 31 views
7

我一直在尋找一個解決方案,這一段時間了。用於自然分類的IComparer

當我整理了以下使用字符串排序我的列表:

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

我真正想要的清單是:

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

數值排序不要麼做的工作。

+0

爲什麼數字排序不能完成這項工作? – lahsrah 2011-12-19 23:03:30

+5

看看http://www.codeproject.com/KB/string/NaturalSortComparer.aspx – 2011-12-19 23:08:09

+0

@pratapchandra - 應該只是讓你的評論一個正式的答案。 – Jagd 2011-12-19 23:16:51

回答

4

解釋的。如果你有LINQ,你可以使用OrderBy

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

爲我工作,但我不得不將Integer.Parse更改爲Int32.Parse,.value應該大寫。語法,meh ... – Jagd 2011-12-19 23:37:50

+0

@Jagd:糟糕:P我是一個VB.NET的人,它是'Integer'那裏。 – Ryan 2011-12-19 23:42:39

+0

從OP問題是否需要一個完全自然搜索的問題並不清楚,該搜索也會依次排列「A1」,「A2」,「Bumblebee」。 – 2011-12-20 00:03:36

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