原因
在 Unity 中提供了编辑器时的自然数排序(EditorUtility.NaturalCompare
接口,见上篇《Unity 字符串按自然数排序》),但是运行时也需要进行自然数排序。
解决
新建IEnumerableEx.cs
文件,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public static class IEnumerableEx
{
public static IOrderedEnumerable<T> OrderByAlphaNumeric<T>(this IEnumerable<T> source, Func<T, string> selector)
{
int max = source
.SelectMany(i => Regex.Matches(selector(i), @"\d+").Cast<Match>().Select(m => (int?)m.Value.Length))
.Max() ?? 0;
return source.OrderBy(i => Regex.Replace(selector(i), @"\d+", m => m.Value.PadLeft(max, '0')));
}
}
调用代码如下:
List<string> names = new List<string>();
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);
}
运行结果如下: