使用 system.io.directory.getfiles 获取文件列表后,调用 enumerable.orderby 配合正则表达式提取文件名中的数字部分进行排序。具体做法是将文件名拆分为文本前缀和数值后缀,先按文本部分排序,再按提取出的整数大小排序,这样就能得到符合人类阅读习惯的自然顺序结果。

OrderBy 如何提取并比较数字
通过正则表达式 (\D+)(\d+) 匹配文件名,将非数字字符作为第一排序键,数字字符解析为整数作为第二排序键。这种分组比较方式确保了 "file10" 排在 "file2" 之后,而不是像字典序那样排在前面。

using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string[] files = { "img10.png", "img2.jpg", "img1.png", "img12.bmp" };
var sorted = files.OrderBy(f =>
{
var match = Regex.Match(f, @"(\D+)(\d+)");
if (match.Success)
return (match.Groups[1].Value, int.Parse(match.Groups[2].Value));
return (f, 0);
}).ToArray();
foreach (var f in sorted)
Console.WriteLine(f);
}
}
处理无数字后缀的文件名
当文件名不包含连续数字时,正则匹配失败,代码回退到直接使用完整文件名作为字符串排序。这保证了混合了带数字和不带数字文件的列表依然保持稳定的排序逻辑,不会抛出异常或产生空引用错误。

using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string[] files = { "data.csv", "img10.png", "readme.txt", "img2.jpg" };
var sorted = files.OrderBy(f =>
{
var match = Regex.Match(f, @"(\D+)(\d+)");
if (match.Success)
return (match.Groups[1].Value, int.Parse(match.Groups[2].Value));
return (f, 0);
}).ToArray();
foreach (var f in sorted)
Console.WriteLine(f);
}
}
基于输入 "img10.png" 的排序结果验证
对于输入列表中的 "img10.png",程序提取出前缀 "img" 和数值 10。在与 "img2.jpg"(前缀 "img",数值 2)比较时,前缀相同,数值 10 大于 2,因此 "img10.png" 排在后面。这一行为验证了自然排序在多位数处理上的正确性。


















