自从我使用 lambda 表达式或 LINQ 以来已经有一段时间了,我想知道我将如何使用这两种方法执行以下操作(我知道我可以使用 foreach 循环,这只是出于好奇)。
我有一个字符串路径数组(这里是数组还是列表会有区别吗?)我想从中返回一个仅包含文件名的新列表。
即使用 foreach 循环将是:
string[] paths = getPaths();
List<string> listToReturn = new List<string>();
foreach (string path in paths)
{
listToReturn.add(Path.GetFileName(path));
}
return listToReturn;
我如何对 lambda 和 LINQ 做同样的事情?
编辑:在我的例子中,我使用返回的列表作为 ListBox (WPF) 的 ItemsSource,所以我假设它需要是一个列表而不是 IEnumerable ?
最佳答案
您的主要工具是 .Select() 方法。
string[] paths = getPaths();
var fileNames = paths.Select(p => Path.GetFileName(p));
does it make a difference if it's an array or list here?
不,数组还实现了IEnumerable<T>
请注意,这种最小的方法涉及延迟执行,这意味着 fileNames
是一个 IEnumerable<string>
并且仅在从中获取元素时才开始遍历源数组。
如果你想要一个列表(安全起见),使用
string[] paths = getPaths();
var fileNames = paths.Select(p => Path.GetFileName(p)).ToList();
但是当有很多文件时,您可能希望通过使用延迟执行 来相反的方向(交错获得结果,更快)来源:
var filePaths = Directory.EnumerateFiles(...); // requires Fx4
var fileNames = filePaths.Select(p => Path.GetFileName(p));
这取决于您接下来要用 fileNames
做什么.
关于C# - 使用 lambda 表达式或 LINQ 填充列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5418839/