我正在尝试根据文件名订购一组文件。输入是一个包含以下文件的目录:
f0.vesperdp
f1.vesperdp
f2.vesperdp
....
f9.vesperdp
f10.vesperdp
f11.vesperdp
f12.vesperdp
我已经构建了这个LINQ查询来对它们进行排序:
if (Directory.Exists(path))
{
var directoryInfo = new DirectoryInfo(path);
var files = from file in directoryInfo.EnumerateFiles()
.Where(f => f.Extension == PAGE_FILE_EXTENSION)
orderby file.Name.Substring(1, file.Name.Length - 1) ascending
select file.FullName;
return files.ToArray<string>();
}
但他们正在回归
f0.vesperdp
f1.vesperdp
f10.vesperdp
....
f19.vesperdp
f2.vesperdp
f20.vesperdp
f21.vesperdp
我需要使用自然顺序对它们进行排序(从0到n为f0,f1,f2...,f9,f10,f11
)如何修复我的orderby过滤器以匹配它?或者如果有其他方式,我怎么能实现呢?提前谢谢。
答案 0 :(得分:1)
正在对字符串进行正确排序,您必须将只需数字输出,转换为整数,然后再订购。这是未经测试的,但你明白了这个想法:
public int GetInt(string filename)
{
int idx = file.Name.IndexOf(".");
if(idx < 0) throw new InvalidOperationException();
return Convert.ToInt32(filename.SubString(1, file.Name.Length - (idx - 1)));
}
然后你的订单部分:
.Where(f => f.Extension == PAGE_FILE_EXTENSION)
orderby GetInt(file.Name) ascending
select file.FullName;
答案 1 :(得分:1)
Naspinski在理论上是正确的,但这是代码中的解决方案。
if (Directory.Exists(path))
{
var directoryInfo = new DirectoryInfo(path);
var files = from file in directoryInfo.EnumerateFiles()
.Where(f => f.Extension == PAGE_FILE_EXTENSION)
orderby int.Parse(file.Name.Substring(1, file.Name.IndexOf('.')-1)) ascending
select file.FullName;
return files.ToArray<string>();
}
order-by子句基本上会更改为在前导'f'和第一个点之间拉出所有内容,从示例中将是一个数字字符串,然后将其解析为整数并显示。
答案 2 :(得分:0)
只需从名称中提取int
值,然后使用该值orderby
:
.Where(f => f.Extension == PAGE_FILE_EXTENSION)
orderby int.Parse(file.Name.Substring(1, file.Name.Length -
file.Extension.Length-1)) ascending
select file.FullName;