C#从X开始获取按名称排序的目录

时间:2018-07-30 19:41:38

标签: c# linq directory

我需要获取另一个目录中的目录,但是只有那些在“ X之后”的目录才能通过目录名对其进行排序。

示例:

-Root
  |--DirectoryA
  |--DirectoryB
  |--DirectoryC
  |--DirectoryD

基本上就是这样:

foreach(string path in Directory.GetDirectories("/root/"))
{
    Console.WriteLine(path);
}

输出:

/root/DirectoryA
/root/DirectoryB
/root/DirectoryC
/root/DirectoryD

但是我实际上只需要在C之后(包括C)获得那些,我想与Linq在一起应该不太难,但是我真的看不到如何。

也许像这样:

Directory.GetDirectories("/root/").OrderByDescending(dirName => 
Path.GetDirectoryName(dirName)) ??

3 个答案:

答案 0 :(得分:2)

您可以使用SkipWhile,假设顺序是字母顺序:

foreach(string path in Directory.GetDirectories("/root/")
                                .Select(dir => Path.GetFileName(dir))
                                .SkipWhile(dir => string.Compare(dir, "DirectoryC") < 0)
{
    Console.WriteLine(path);
}

这样,您将避免在遇到第一个有效目录后进行多余的过滤。

如果您只想提取DirectoryC之前的文件夹,则可以使用TakeWhile

foreach(string path in Directory.GetDirectories("/root/")
                                .Select(dir => Path.GetFileName(dir))
                                .TakeWhile(dir => string.Compare(dir, "DirectoryC") < 0)
{
    Console.WriteLine(path);
}

请注意,string.Compare是与文化相关的,您可以使用other overloads自定义其行为。

答案 1 :(得分:1)

使用Where扩展名方法

foreach(string path in Directory
           .GetDirectories("/root/")
           .Where(d => String.Compare(Path.GetFileName(d), "DirectoryC") > 0))
{
    Console.WriteLine(path);
}

如果需要,您还可以包括一个顺序,但这不会影响使用Where进行的过滤。如果这样做,则将其附加在Where之后以提高效率。

答案 2 :(得分:0)

或者如果您使用的是旧版.NET,则可以随时自己编写逻辑:

var directories = Directory.GetDirectories("C:\\").OrderByDescending(r => r).ToArray();
            if (directories != null && directories.Length > 0)
            {
                for (int i = 0, Cindex=-1; i < directories.Length; i++)
                {
                    if (Cindex > 0)
                    {
                        Console.WriteLine(directories[i]);
                        continue;
                    }
                    if (directories[i] == "DirectoryC")
                    {
                        Cindex = i;
                    }
                }
            }