2

私のハードディスクには、たとえば次のものがあります。

dir1 dir2 dir3 dir4 .....

私のコードは次のとおりです。

DirectoryInfo dInfo = new DirectoryInfo(AutomaticsubDirectoryName);
DirectoryInfo[] subdirs = dInfo.GetDirectories();

そのため、subdirsすべてのディレクトリを取得していますが、ハードディスク上の順序と同じではありません。subdirsハードディスク上と同じ順序になるように並べ替えるにはどうすればよいですか?


これで解決しました:

DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d =>
                    {
                        int i = 0;
                        if (d.Name.Contains("Lightning ") && d.Name.Contains(" Length") && d.Name.IndexOf("Lightning ") < d.Name.IndexOf(" Length"))
                        {
                            string z = d.Name.Substring(("Lightning ").Length);
                            string f = z.Substring(0, z.IndexOf(" Length"));
                            if (Int32.TryParse(f, out i))
                                return i;
                            else
                                return -1;
                        }
                        else
                            return -1;
                    }).ToArray();

完璧に動作します。

4

4 に答える 4

2

Windowsが使用する文字列比較関数は、誰もが使用できるように公開されています。したがって、Explorerが使用するのとまったく同じ並べ替え順序を取得するには、ちょっとしたピンボークが必要になります。これをIComparer<>でラップして、Array.Sort()またはOrderBy()Linq句に渡すことができます。

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public class LogicalComparer : IComparer<string> {
    public int Compare(string x, string y) {
        return StrCmpLogicalW(x, y);
    }
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    private static extern int StrCmpLogicalW(string s1, string s2);
}
于 2013-01-12T15:56:03.793 に答える
1

ファイルシステムと、Windows Explorer のようなソフトウェアが名前を表示する方法について話していると仮定すると、名前の自然な並べ替えについて話していると思います。ここを読む: http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

于 2013-01-12T11:52:27.373 に答える
1

Craetion timeそれらがハードディスクにどのように表示されるかは、合理的な基準です。

DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d => d.CreationTime).ToArray();
于 2013-01-12T11:52:37.863 に答える
-2

これで解決しました:

DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d =>
                    {
                        int i = 0;
                        if (d.Name.Contains("Lightning ") && d.Name.Contains(" Length") && d.Name.IndexOf("Lightning ") < d.Name.IndexOf(" Length"))
                        {
                            string z = d.Name.Substring(("Lightning ").Length);
                            string f = z.Substring(0, z.IndexOf(" Length"));
                            if (Int32.TryParse(f, out i))
                                return i;
                            else
                                return -1;
                        }
                        else
                            return -1;
                    }).ToArray();

完璧に動作します。

于 2013-01-14T16:33:04.690 に答える