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

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 に答える
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 に答える
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 に答える