我需要获取另一个目录中的目录,但是只有那些在“ 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)) ??
答案 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;
}
}
}