C# 数字排序

使用list.sort()、list.orderby()、string[].orderby()数字排序例子
TeamNameComparer : IComparer实现类来自https://www.jianshu.com/p/38895c43683e

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;


namespace 数字排序
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("string[]   OrderBy 排序");
        string[] numstrs = new string[] { "排序3", "排序31", "排序32", "排序1", "排序31", "排序11", "排序21", "排序22", "排序2", "排序4" };
        numstrs = numstrs.OrderBy((s) => int.Parse(Regex.Match(s, @"\d+").Value)).ToArray();//升序
        //numstrs.OrderByDescending((s) => int.Parse(Regex.Match(s, @"\d+").Value));//降序

        foreach (string item in numstrs)
        {
            Console.Write(item + "\t");
        }
        //Console.WriteLine();
        //Console.ReadLine();
        Console.WriteLine();
        Console.WriteLine("List<string>   OrderBy 排序");
        List<string> numlist = new List<string>() { "排序3", "排序31", "排序32", "排序1", "排序31", "排序11", "排序21", "排序22", "排序2", "排序4" };
        //=========方法一:使用orderby排序
        //numlist.Sort();
        numlist = numlist.OrderBy((s) => int.Parse(Regex.Match(s, @"\d+").Value)).ToList();
        //numlist = numlist.OrderBy((s) => int.Parse(Regex.Match(s, @"\d+").Value)).ThenBy(s => s).ToList();
        
       //数组组中字符串出现无数字时光int.Parse会报错,如"排序A", "排序B" 
        string[] numstrs = new string[] { "排序3", "排序31", "排序32", "排序1", "排序31", "排序11", "排序21", "排序22", "排序2", "排序4", "排序A", "排序B" };
        numstrs = numstrs.OrderBy((s) =>
        {
            try
            {
                return int.Parse(Regex.Match(s, @"\d+").Value);
            }
            catch (Exception ex)
            {
                return 0;
            }

        }).ToArray();//升序
        

        foreach (string item in numlist)
        {
            Console.Write(item + "\t");
        }
        //=========方法一:使用orderby排序

        Console.WriteLine();
        Console.WriteLine("List<string>   实现IComparer 排序");
        //=========方法二:使用IComparer排序
        List<string> numlist1 = new List<string>() { "排序3", "排序31", "排序32", "排序1", "排序31", "排序11", "排序21", "排序22", "排序2", "排序4" };
        TeamNameComparer tnc = new TeamNameComparer();
        numlist1.Sort(tnc);
        foreach (string item in numlist1)
        {
            Console.Write(item + "\t");
        }
        //=========方法二:使用IComparer排序
        Console.WriteLine();
        Console.ReadLine();

    }
}


public class TeamNameComparer : IComparer<object>
{
    public int Compare(object x, object y)
    {
        if (x == null || y == null)
        {
            throw new ArgumentException("Parameters can't be null");
        }

        var nameA = x as string;
        var nameB = y 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;
        }
    }
}
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值