C# 如何按名称对文件列表进行排序,以匹配Windows资源管理器的显示方式?

C# 如何按名称对文件列表进行排序,以匹配Windows资源管理器的显示方式?,c#,.net,sorting,C#,.net,Sorting,假设我在Explorer中按名称对文件列表进行了排序,如下所示: 2009-06-02-4.0.9.txt 2009-06-02-4.0.10.txt 2009-06-02-4.0.11.txt 2009-06-02-4.0.12.txt 我有一个FileInfo比较器,可以按名称对FileInfo对象数组进行排序: class FileInfoComparer : IComparer<FileInfo> { public int Compare(FileIn

假设我在Explorer中按名称对文件列表进行了排序,如下所示:

2009-06-02-4.0.9.txt
2009-06-02-4.0.10.txt
2009-06-02-4.0.11.txt
2009-06-02-4.0.12.txt

我有一个FileInfo比较器,可以按名称对FileInfo对象数组进行排序:

    class FileInfoComparer : IComparer<FileInfo> {
        public int Compare(FileInfo x, FileInfo y) {
            return string.Compare(x.FullName, 
                                  y.FullName, 
                                  StringComparison.OrdinalIgnoreCase);
        }
    }
类文件信息比较器:IComparer{
公共整数比较(FileInfo x,FileInfo y){
返回字符串。比较(x.FullName,
y、 全名,
对照组(例);
}
}
使用此比较器对上面相同的文件列表进行排序会产生:

2009-06-02-4.0.10.txt
2009-06-02-4.0.11.txt
2009-06-02-4.0.12.txt
2009-06-02-4.0.9.txt

这是有问题的,因为顺序非常重要

我可以想象有一种方法可以模仿Windows在C#代码中所做的事情,但我还没有找到一种方法。感谢您的帮助


谢谢

还可以使用p/Invoke调用win32 API。这将是最一致的行为,并且可能表现得更好(我将对这两个选项进行基准测试)。甚至代码项目链接也与windows行为不完全一致,也不是未来的证明。

windows资源管理器使用一个名为:

StrCmpLogicalW
以“逻辑”方式执行排序


也有人会帮你做这件事。

你需要一个自然的数字排序,不幸的是,在.NET framework中没有本机的实现。on CodeProject将告诉您有关制作自己的.NET克隆所需的所有信息。

有时,根据数据,您可以执行以下操作:

using System.Linq;         
...

    string[] dirs = _fileSystem.GetDirectories(_root);
    dirs = dirs.OrderBy(x => x.Length).ThenBy(x => x);

这适用于您的问题中的示例数据。

在托管代码中实现您自己的strmplogical w版本是最好的选择,代码项目文章使这一点变得非常简单