【问题标题】:C# get directories ordered by name starting from XC# 获取从 X 开始按名称排序的目录
【发布时间】:2019-01-07 03:07:01
【问题描述】:

我需要获取另一个目录中的目录,但只有那些在 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 之后的那些(包括它),我想用 Linq 应该不会太难,但我真的看不出怎么做。

可能是这样的:

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

【问题讨论】:

    标签: c# linq directory


    【解决方案1】:

    你可以使用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 自定义其行为。

    【讨论】:

    • 我收到错误:运算符“
    • 是的,你应该使用string.Compare
    【解决方案2】:

    使用Where扩展方法

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

    如果需要,您还可以包含排序,但它不会影响Where 的过滤。如果这样做,请将其附加在Where 之后以提高效率。

    【讨论】:

    • 出现以下错误:foreach (string versionDirectory in Directory.GetDirectories("/root/").Where(d =&gt; d.Name &gt;= "")): CS1061 'string' 不包含'Name' 的定义,并且找不到接受'string' 类型的第一个参数的扩展方法'Name' (您是否缺少 using 指令或程序集引用?
    • 根据您所做的更改,我得到:错误:运算符 '>=' 不能应用于“字符串”和“字符串”类型的操作数。
    • 好吧,我想它会返回一个DirectoryInfo;但是,它返回一个全名(包括路径)的字符串数组。
    【解决方案3】:

    或者如果您使用的是旧版本的 .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;
                        }
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多