假设我按名称在资源管理器中对文件列表进行了排序,如下所示:
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#代码中所做的事情,但我还没有找到办法。任何帮助表示赞赏!
谢谢!
答案 0 :(得分:11)
答案 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);
这适用于问题中的示例数据。