2

我必须使用数字顺序从特定目录中检索文件名列表。实际上文件名是字符串和数值的组合,但以数值结尾。

例如: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
4

5 回答 5

5

Ian Griffiths对 C# 有一种自然的排序。它不对数字出现的位置做任何假设,甚至可以正确地对具有多个数字组件的文件名进行排序,例如 app-1.0.2、app-1.0.11。

于 2013-05-30T10:31:43.243 回答
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)));
于 2013-05-30T11:14:32.710 回答
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)));
于 2013-05-30T10:33:12.290 回答
1

也许这个?

string[] filePaths = Directory.GetFiles(filePath, "*.png").OrderBy(n => n);

编辑:正如 Marcelo指出的那样,我相信您可以获得所有文件名,您可以使用正则表达式获得它们的数字部分,而不是您可以对它们进行排序,包括它们的文件名。

于 2013-05-30T10:27:43.433 回答
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);

它还会过滤掉那些名称中没有数字的文件。

您可能希望更改正则表达式模式以匹配文件名的更具体的名称结构。

于 2013-05-30T10:34:40.253 回答