Linq按文件名编号排序

时间:2012-07-23 17:05:37

标签: c# linq algorithm

我正在尝试根据文件名订购一组文件。输入是一个包含以下文件的目录:

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过滤器以匹配它?或者如果有其他方式,我怎么能实现呢?提前谢谢。

3 个答案:

答案 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;