用于自然分类的IComparer

我一直在寻找解决方案一段时间了。

当我使用字符串排序对下面排序时,我有一个列表:

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

我真的希望列表是:

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

数字排序也不能完成这项工作。

如果你有LINQ,你可以使用OrderBy

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

最简单的方法是按照https://stackoverflow.com/a/248613/631687中的说明包装Win32 API调用

 using System; using System.Collections.Generic; using System.Text.RegularExpressions; public class NumStrCmp : IComparer { public int Compare(string x, string y){ Regex regex = new Regex(@"(?\d+)(?\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() {"10","10b","1111","1164","1174","23","23A","23B","23D","23E"}; data.Sort(new NumStrCmp()); foreach(var x in data){ Console.WriteLine(x); } } } 

我希望这个链接可以帮助您使用自然的Sort Comparer进行自然排序