美文网首页
C#按字符串中的数字排序问题

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

作者: 拎壶冲da | 来源:发表于2017-02-07 19:11 被阅读344次

    在项目的开发中遇到这么个问题,原本应该是按照丐帮1, 丐帮2, 丐帮3 ....的顺序进行排序的,这里的顺序却成了 丐帮1, 丐帮10, 丐帮11...

    分组列表

    问题
    在.net的framework框架中提供的排序方法, 如List<T>.Sort()方法,对字符串进行排序时,如果字符串中含有数字,则不会按数字大小进行排序。

    解决方案
    为了序排序后的效果为我们想要的按字符串中的数值排序,我们必须重写字符串的比较函数。

    代码思路
    由于比较两个字符串时,是逐个比较字符,先从第一个字符开始比较,取出两个字符串中的第一个字符比较,如果比较结果是大于,则说明第一个字符串大于第二个字符串,如果小于,则说明第一个字符串小于第二字符串,如果等于,则比较两个字符串中的第二个字符。如果比到最后也是相等,则说明两个字符串一样大,如果有一个字符串要多一些字符,则这个字符串在大一些。
    我们改进这个算法:在比较过程中如果发现数字,则先不进行比较,看下一个字符是否为数字,这个取出两个字符串中的数字,按数字的数值大小来进行比较。如果相等再取一个字符进行比较。

    代码实现:(这里的Team为自定义的对象)

    public class TeamNameComparer : IComparer<Team>
        {
            public int Compare(Team x, Team y)
            {
                if (x == null || y == null)
                {
                    throw new ArgumentException("Parameters can't be null");
                }
    
                var nameA = x.Name as string;
                var nameB = y.Name as string;
                var arr1 = nameA.ToCharArray();
                var arr2 = nameB.ToCharArray();
    
                var i = 0;
                var j = 0;
    
                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 1;
                        }
                        if (int.Parse(s1) < int.Parse(s2))
                        {
                            return -1;
                        }
                    }
                    else
                    {
                        if (arr1[i] > arr2[j])
                        {
                            return 1;
                        }
                        if (arr1[i] < arr2[j])
                        {
                            return -1;
                        }
                        i++;
                        j++;
                    }
                }
    
                if (arr1.Length == arr2.Length)
                {
                    return 0;
                }
                else
                {
                    return arr1.Length > arr2.Length ? 1 : -1;
                }
            }
        }
    

    修改后的排序为:

    排序后的分组列表

    相关文章

      网友评论

          本文标题:C#按字符串中的数字排序问题

          本文链接:https://www.haomeiwen.com/subject/jnymittx.html