C# 如何按名称对文件列表进行排序,以匹配Windows资源管理器的显示方式?
假设我在Explorer中按名称对文件列表进行了排序,如下所示: 2009-06-02-4.0.9.txtC# 如何按名称对文件列表进行排序,以匹配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
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.txt2009-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版本是最好的选择,代码项目文章使这一点变得非常简单