1

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

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 as )对它们进行排序f0,f1,f2...,f9,f10,f11如何修复我的 orderby 过滤器以匹配这个?或者,如果有其他方法,我该如何实现?提前致谢。

4

3 回答 3

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)));
} 

然后你的 orderby 部分:

.Where(f => f.Extension == PAGE_FILE_EXTENSION)
    orderby GetInt(file.Name) ascending
    select file.FullName;
于 2012-07-23T17:07:55.857 回答
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' 和第一个点之间的所有内容,从您的示例中,这将是一个数字字符串,然后将其解析为整数并显示。

于 2012-07-23T17:11:52.317 回答
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;
于 2012-07-23T17:08:41.337 回答