使用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;
}
}
}
}