我必须使用数字顺序从特定目录中检索文件名列表。实际上,文件名是字符串和数值的组合,但以数值结束。
例如:page_1.png,page_2.png,page3.png ...,page10.png,page_11.png,page_12.png ......
我的c#代码如下:
string filePath="D:\\vs-2010projects\\delete_sample\\delete_sample\\myimages\\";
string[] filePaths = Directory.GetFiles(filePath, "*.png");
按以下格式检索:
page_1.png
page_10.png
page_11.png
page_12.png
page_2.png...
我希望检索如下订单:
page_1.png
page_2.png
page_3.png
[...]
page_10.png
page_11.png
page_12.png
答案 0 :(得分:4)
Ian Griffiths有一个natural sort for C#。它不会假设数字出现的位置,甚至可以使用多个数字组件(例如app-1.0.2,app-1.0.11)正确排序文件名。
答案 1 :(得分:2)
首先,您可以提取数字:
static int ExtractNumber(string text)
{
Match match = Regex.Match(text, @"_(\d+)\.(png)");
if (match == null)
{
return 0;
}
int value;
if (!int.TryParse(match.Value, out value))
{
return 0;
}
return value;
}
然后您可以使用以下方式对列表进行排序:
list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));
答案 2 :(得分:2)
您可以尝试使用以下代码,该代码根据数值对文件名进行排序。请记住,此逻辑基于某些约定,例如'_'的可用性。您可以自由修改代码以添加更多防御方法,除非您遇到任何商业案例。
var vv = new DirectoryInfo(@"C:\Image").GetFileSystemInfos("*.bmp").OrderBy(fs=>int.Parse(fs.Name.Split('_')[1].Substring(0, fs.Name.Split('_')[1].Length - fs.Extension.Length)));
答案 3 :(得分:1)
也许这个?
string[] filePaths = Directory.GetFiles(filePath, "*.png").OrderBy(n => n);
编辑:正如Marcelo pointed,我相信你可以获得所有文件名,你可以用正则表达式得到它们的数字部分,而不是你可以对它们进行排序,包括它们的文件名。 / p>
答案 4 :(得分:0)
这段代码会这样做:
var dir = @"C:\Pictures";
var sorted = (from fn in Directory.GetFiles(dir)
let m = Regex.Match(fn, @"(?<order>\d+)")
where m.Success
let n = int.Parse(m.Groups["order"].Value)
orderby n
select fn).ToList();
foreach (var fn in sorted) Console.WriteLine(fn);
它还会过滤掉名称中没有数字的文件。
您可能希望更改正则表达式模式以匹配文件名的更具体的名称结构。