c#按字符串中的数字排序问题 您所在的位置:网站首页 nga账号 c#按字符串中的数字排序问题

c#按字符串中的数字排序问题

2024-04-29 04:06| 来源: 网络整理| 查看: 265

 在.net 的framewrok框架中提供的排序方法中,如string.sort() 或ArrayList.Sort()方法。这两个方法对字符串排序时,如果字符串中含有数字,则不会按数字大小排序。如:

如下有四个字符串,  ArrayList list = new ArrayList(4);  List.Add(“aa1”); List.Add(“aa100);  List.Add(“aa10);  List.Add(“aa2”);  List.Sort();   我们原意希望排序后的顺序为:  aa1,aa2,aa10,aa100   可是上面的代码执行后的排序顺序为  aa1,aa10,aa100,aa2   为了序排序后的效果为我们想要的按字符串中的数值排序,我们必须重写字符串的比较函数。 代码思路: 由于比较两个字符串时,是逐个比较字符,先从第一个字符开始比较,取出两个字符串中的第一个字符比较,如果比较结果是大于,则说明第一个字符串大于第二个字符串,如果小于,则说明第一个字符串小于第二字符串,如果等于,则比较两个字符串中的第二个字符。如果比到最后也是相等,则说明两个字符串一样大,如果有一个字符串要多一些字符,则这个字符串在大一些。 我们改进这个算法:在比较过程中如果发现数字,则先不进行比较,看下一个字符是否为数字,这个取出两个字符串中的数字,按数字的数值大小来进行比较。如果相等再取一个字符进行比较。   如下我的代码:(注:对于上面的例子,由于我们可以利用sort()函数的另一重载方法。Sort (         IComparer comparer )) 故我们只需要写一个继承自Icomparer接口的比较类,即可。 /// ///主要用于文件名的比较。 /// public class FilesNameComparerClass : IComparer { // Calls CaseInsensitiveComparer.Compare with the parameters reversed. /// ///比较两个字符串,如果含用数字,则数字按数字的大小来比较。 /// /// /// /// int IComparer.Compare( Object x, Object y ) { if(x==null||y==null) throw new ArgumentException("Parameters can't be null"); string fileA = x as string; string fileB = y as string; char[] arr1 = fileA.ToCharArray(); char[] arr2 = fileB.ToCharArray(); int i = 0, j =0; while( i < arr1.Length && j int.Parse( s2) ) { return 1; } if ( int.Parse( s1 ) < int.Parse( s2) ) { return -1; } } else { if ( arr1[i] > arr2[j] ) { return 1; } if ( arr1[i] arr2.Length? 1: -1; } // return string.Compare( fileA, fileB ); // return( (new CaseInsensitiveComparer()).Compare( y, x ) ); } } 调用时的代码如下: IComparer fileNameComparer = new FilesNameComparerClass(); List.Sort( fileNameComparer ); 这样排序后的字符串就为按字符串中的数值排序了,为: aa1,aa2,aa10,aa100


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有