7

0 から 39 までの名前を持つ 40 個のファイルを含むディレクトリがあり (たとえば)、名前に最大の番号を持つファイルを取得しようとしています (つまり、「39」を取得する必要があります) ディレクトリをソートしようとしています.. 次のトピックを使用してみました。

名前でソートされたディレクトリ内のファイルのリストを取得する方法

C# での Directory.GetFiles の結果の並べ替え

私には何もうまくいきません..私は各方法を試しました-Linqと他の方法を使用して..そして私は理由がわかりません..

並べ替えの結果は次のようになります (下の図を確認してください)。 ここに画像の説明を入力

助けてくれてありがとう、

ディン・ブラチャ。

4

3 に答える 3

8

それらがそのようにソートされるのは論理的です。数値でソートするためのセマンティクスを導入します。つまり、すべてのファイル名を数値に解析してから、それでファイルをソートします。

何かのようなもの

files.OrderBy(path => Int32.Parse(Path.GetFileNameWithoutExtension(path)))

Last()最大番号のファイルを取得するために使用します。

于 2012-07-29T23:11:07.863 に答える
2

StrCmpLogicalWWindowsには、文字列の数値を文字ではなく数値として比較するネイティブ関数があります。その関数を呼び出して比較に使用する比較子を作成するのは簡単です。

public class StrCmpLogicalComparer : Comparer<string>
{
    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
    private static extern int StrCmpLogicalW(string x, string y);

    public override int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }
}

StrCmpLogicalWデフォルトの並べ替えと並べ替えの違いを示すプログラムの例を次に示します。

class Program
{
    static void Main()
    {
        List<string> items = new List<string>()
        {
            "Example1.txt", "Example2.txt", "Example3.txt", "Example4.txt", "Example5.txt", "Example6.txt", "Example7.txt", "Example8.txt", "Example9.txt", "Example10.txt",
            "Example11.txt", "Example12.txt", "Example13.txt", "Example14.txt", "Example15.txt", "Example16.txt", "Example17.txt", "Example18.txt", "Example19.txt", "Example20.txt"
        };

        items.Sort();

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();

        items.Sort(new StrCmpLogicalComparer());

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
}

出力する

Example1.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example2.txt
Example20.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt

Example1.txt
Example2.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example20.txt
于 2016-09-01T20:58:16.473 に答える