2

在我的硬盘上,我有例如:

目录 1 目录 2 目录 3 目录 4 .....

我的代码是:

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 使用的字符串比较功能公开给大家使用。因此,您需要一点点 pinvoke 才能获得与 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 回答