/ Editor 与 Runtime 的EditorUtility.NaturalCompare类似的排序
在对列表里的字符串进行排序时,当存在有自然数时,想要让之以自然数顺序进行排序,然而默认的排序是不支持自然数排序的,需要自己实现。
排序方式对比如下:
Alphabetic sort Natural numeric sort
DOS (CMD prompt) style Windows Explorer Style
1.txt 1.txt
10.txt 3.txt
3.txt 10.txt
a10b1.txt a1b1.txt
a1b1.txt a2b1.txt
a2b1.txt a2b2.txt
a2b11.txt a2b11.txt
a2b2.txt a10b1.txt
b1.txt b1.txt
b10.txt b2.txt
b2.txt b10.txt
实现
.NET平台
在.NET平台下,可以使用《Numeric String Sort in C#》文章里提供的方法。
Unity平台
在编辑器下,可以使用EditorUtility.NaturalCompare接口,运行时的话,只能使用.NET平台的方法。
测试
测试代码如下:
private void Test()
{
List
names.Add("1.txt");
names.Add("a10b1.txt");
names.Add("a1b1.txt");
names.Add("10.txt");
names.Add("3.txt");
names.Sort();
foreach (var n in names)
{
Debug.Log(n);
}
names.Sort(EditorUtility.NaturalCompare);
foreach (var n in names)
{
Debug.Log(n);
}
}
运行结果前后对比如下:
运行时也需要进行自然数排序。
解决新建IEnumerableEx.cs文件,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public static class IEnumerableEx
{
public static IOrderedEnumerable
{
int max = source
.SelectMany(i => Regex.Matches(selector(i), @"d+").Cast
.Max() ?? 0;
return source.OrderBy(i => Regex.Replace(selector(i), @"d+", m => m.Value.PadLeft(max, '0')));
}
}
调用代码如下:
List
names.Add("1.txt");
names.Add("a10b1.txt");
names.Add("a1b1.txt");
names.Add("10.txt");
names.Add("3.txt");
names.Sort();
foreach (var n in names)
{
Debug.Log(n);
}
//names.Sort(EditorUtility.NaturalCompare);
var val = names.OrderByAlphaNumeric(s => s).ToList();
names.Clear();
names.AddRange(val);
foreach (var n in names)
{
Debug.Log(n);
}
运行结果如下:
///



