C# 如何从c中指定的目录中以数字顺序获取文件?

C# 如何从c中指定的目录中以数字顺序获取文件?,c#,c#-4.0,sorting,C#,C# 4.0,Sorting,我必须使用数字顺序从特定目录检索文件名列表。实际上,文件名是字符串和数字值的组合,但以数字值结尾 例如: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(

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

例如: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
也许是这个

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

编辑:作为Marcelo,我相信你可以得到所有文件名,你可以用正则表达式得到它们的数字部分,然后你可以对它们进行排序,包括它们的文件名。

Ian Griffiths有一个。它不假设数字出现的位置,甚至可以使用多个数字组件(如app-1.0.2、app-1.0.11)对文件名进行正确排序。

首先,您可以提取数字:

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)));

此代码将执行以下操作:

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);
它还过滤掉那些名称中没有数字的文件


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

您可以尝试以下代码,这些代码根据数值对文件名进行排序。请记住,此逻辑是基于一些约定工作的,例如“\u1”的可用性。您可以自由修改代码以添加更多防御方法,从而避免任何商业案例

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)));

这是正常的行为。。。您需要将文件命名为page_01.png等…将它们填入object。然后执行一些字符串维护计算,以获得介于_和之间的字符串。并将其更改为int并指定对象的某些属性。然后在对列表进行排序后,根据该属性获取项。这非常简单OP想要按数字排序。也就是说,page_2.png应该放在page_11.png之前。这是一个很好的资源,但是我们不喜欢包含代码而不仅仅是一个链接,甚至是一个带有解释的链接吗?