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

时间:2009-06-18 14:34:08

标签: c# .net sorting

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

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 Comparer,它按名称对FileInfo对象数组进行排序:

    class FileInfoComparer : IComparer<FileInfo> {
        public int Compare(FileInfo x, FileInfo y) {
            return string.Compare(x.FullName, 
                                  y.FullName, 
                                  StringComparison.OrdinalIgnoreCase);
        }
    }

使用此Comparer从上面对相同的文件列表进行排序:

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#代码中所做的事情,但我还没有找到办法。任何帮助表示赞赏!

谢谢!

4 个答案:

答案 0 :(得分:11)

Windows资源管理器使用名为:

的API
StrCmpLogicalW

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

有人implemented a class in C#会为你做这件事。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您需要一个自然的数字排序,遗憾的是.NET框架中没有本机实现。 CodeProject上的This article会告诉您有关制作自己的.NET克隆的所有信息。

答案 3 :(得分:0)

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

using System.Linq;         
...

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

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