在.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接口的比较类,即可。
    ///<summary>
///主要用于文件名的比较。
///</summary>
public class FilesNameComparerClass : IComparer
{
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
///<summary>
///比较两个字符串,如果含用数字,则数字按数字的大小来比较。
///</summary>
///<param name="x"></param>
///<param name="y"></param>
///<returns></returns>
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 = , j =;
while( i < arr1.Length && j < arr2.Length)
{
if ( char.IsDigit( arr1[i]) && char.IsDigit( arr2[j] ) )
{
string s1 = "",s2 = "";
while ( i < arr1.Length && char.IsDigit( arr1[i]) )
{
s1 += arr1[i];
i++;
}
while (j < arr2.Length && char.IsDigit( arr2[j] ))
{
s2 += arr2[j];
j++;
}
if ( int.Parse( s1 ) > int.Parse( s2) )
{
return ;
}
if ( int.Parse( s1 ) < int.Parse( s2) )
{
return -;
}
}
else
{
if ( arr1[i] > arr2[j] )
{
return ;
}
if ( arr1[i] < arr2[j] )
{
return -;
}
i++;
j++;
}
}
if ( arr1.Length == arr2.Length )
{
return ;
}
else
{
return arr1.Length > arr2.Length? : -;
}
// return string.Compare( fileA, fileB );
// return( (new CaseInsensitiveComparer()).Compare( y, x ) );
}
}
调用时的代码如下:
IComparer fileNameComparer = new FilesNameComparerClass();
List.Sort( fileNameComparer );
这样排序后的字符串就为按字符串中的数值排序了,为:
aa1,aa2,aa10,aa100

c#按字符串中的数字排序问题的更多相关文章

  1. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

  2. SQL Server 2008 R2——创建函数 筛选出字符串中的数字 筛选出字符串中的非数字

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  3. Excel中如何提取字符串中的数字

    取字符串中的数字,假如数据在A列,提取公式为 =LOOKUP(9^9,--MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&5^19)),ROW($1:$99) ...

  4. C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字

            /// 去掉字符串中的数字           public static string RemoveNumber(string key)           {            ...

  5. C++ 提取字符串中的数字

    C++ 提取字符串中的数字 #include <iostream> using namespace std; int main() { ] = "1ab2cd3ef45g&quo ...

  6. java截取字符串中的数字

    java从字符串中提取数字 随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取 ...

  7. python(15)提取字符串中的数字

    python 提取一段字符串中去数字 ss = “123ab45” 方法一:filter filter(str.isdigit, ss) 别处copy的filter的用法: # one>> ...

  8. 用sql获取某字符串中的数字部分的语句

    create function dbo.F_Get_No ( @No varchar(100) ) RETURNS bigint AS BEGIN WHILE PATINDEX('%[^0-9]%', ...

  9. C# 获取字符串中的数字

    /// <summary> /// 获取字符串中的数字(不包含小数点) /// </summary> /// <param name="str"> ...

随机推荐

  1. grunt入门讲解1:grunt的基本概念和使用

    Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.老版本的 Node. ...

  2. [转帖]Linux系统/dev/mapper目录浅谈

    Linux系统/dev/mapper目录浅谈   Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/ma ...

  3. 浅谈|WEB 服务器 -- Caddy

    浅谈|WEB 服务器 -- Caddy 2018年03月28日 12:38:00 yori_chen 阅读数:1490 标签: caddyserverwebhttps反向代理 更多 个人分类: ser ...

  4. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...

  5. spring not_support 该方法被事务方法调用时 不会加入spring事务 只是执行jdbc普通的事务

  6. hdu 1540 Tunnel Warfare (线段树 区间合并)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  7. MT【200】一道自招的不等式

    (2018武汉大学自招)设$x,y,z\ge0,xy+yz+zx=1$证明:$\dfrac{1}{x+y}+\dfrac{1}{y+z}+\dfrac{1}{z+x}\ge \dfrac{5}{2}$ ...

  8. 【题解】 [SCOI2010]传送带 (三分法)

    题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...

  9. 【NOIP 2018】保卫王国(动态dp / 倍增)

    题目链接 这个$dark$题,嗯,不想说了. 法一:动态$dp$ 虽然早有听闻动态$dp$,但到最近才学,如果你了解动态$dp$,那就能很轻松做出这道题了.故利用这题在这里科普一下动态$dp$的具体内 ...

  10. 在windows上部署使用Redis出现问题的解决方法

    下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.目前的是2.8.12版的,直接解压,在\bin\release 目录下有个压缩包, ...