所以我有一个与我的.exe控制台应用程序相同的目录中的文件夹。 我想列出该文件夹内的所有文件夹(它被称为ClientFiles
),但我不想要完整的path。 所以如果我有这样的层次结构:
ClientFiles ---\ Folder1 ---\ Folder2 ---\ Folder3
我应该得到一个包含string的列表:“文件夹1”,“文件夹2”,“文件夹3”。
这就是我现在所拥有的:
List<string> clientNumbers = Directory .GetDirectories(AppDomain.CurrentDomain.BaseDirectory + "ClientFiles\\") .ToList<string>();
但是它返回的列表包含每个元素的完整path。 任何快速解决这个问题的方法? 我想我可以通过foreach删除前面的path文本,但似乎是如此额外。
有几种方法可以做到这一点。
首先是简单地删除你已经知道的组件:
string directory = AppDomain.CurrentDomain.BaseDirectory + "ClientFiles\\"; List<string> clientNumbers = Directory .GetDirectories(directory) .Select(x => x.Substring(AppDomain.CurrentDomain.BaseDirectory.Length - 1) .ToList();
假设你只想要文件名(或文件夹的名称,如果它是一个文件夹对象),你可以使用Path
类
List<string> clientNumbers = Directory .GetDirectories(directory) .Select(x => Path.GetFileName(x)) .ToList();
有了一点LINQ:
List<string> clientNumbers = System.IO.Directory.GetDirectories(AppDomain.CurrentDomain.BaseDirectory + "ClientFiles\\") .Select(x => x.Replace(AppDomain.CurrentDomain.BaseDirectory + "ClientFiles\\", "")).ToList();
您可以在.Select(x=>x.Split('\').LastOrDefault())
添加.Select(x=>x.Split('\').LastOrDefault())
,如:
List<string> clientNumbers = Directory.GetDirectories(AppDomain.CurrentDomain.BaseDirectory + "ClientFiles\\").ToList<string>() .Select(x=>x.Split('\').LastOrDefault());
使用LINQ lambda表达式:
List<string> clientNumbers = Directory.GetDirectories( AppDomain.CurrentDomain.BaseDirectory + "ClientFiles\\") .ToList<string>().Select(s=>s.Split("\\").Last());
LastOrDefault将返回相同的字符串为空