合并2个foreach循环(删除具有特定扩展名的文件)
本文关键字:扩展名 文件 foreach 2个 循环 删除 合并 | 更新日期: 2023-09-27 18:15:02
我得到了以下代码:
foreach (string file in Directory.GetFiles(generationDir, "*.xaml")
{
File.Delete(file);
}
foreach (string file in Directory.GetFiles(generationDir, "*.cs")
{
File.Delete(file);
}
我想把这两个foreach合并成一个循环吗?这可能吗?我对lambda表达式不太满意,所以在这里遇到了困难。。。
foreach (var file in
Directory.GetFiles(generationDir, "*.*")
.Where(item => item.EndsWith(".xaml") || item.EndsWith(".cs")))
{
File.Delete(file);
}
对于那些喜欢ForEach()
"序列运算符伪"的人:((在使用前请注意"foreach"与"foreach">(
Directory.GetFiles(generationDir, "*.*")
.Where(item => item.EndsWith(".xaml") || item.EndsWith(".cs"))
.ToList()
.ForEach(item => File.Delete(item))
如果您使用的是.NET Framework v4,则可以使用更高效的Directory.EnumerateFiles((方法:
EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles,可以开始枚举名称集合在整个集合返回之前;使用GetFiles时必须等待返回整个名称数组,然后才能访问阵列。因此,当您使用许多文件和目录,EnumerateFiles可以更高效。
返回的集合未缓存;每次调用GetEnumerator将启动一个新的枚举。
您可以将两个集合并集
var items = Directory.GetFiles(generationDir, "*.xaml").Where(item => item.EndsWith(".xaml"))
.Union(Directory.GetFiles(generationDir, "*.cs").Where(item => item.EndswWith(".cs"))
然后用前臂穿过它们。
顺便说一句,每个集合上的where子句对我来说似乎是多余的,因为GetFiles使用了您提供的掩码,所以所有文件都应该以.xaml或.cs.结尾
使用LINQ:怎么样
var files = from extension in new[] { "xaml", "cs" }
from fileName in Directory.GetFiles(generationDir, "*." + extension)
select fileName;
foreach(var file in files)
File.Delete(file);
或者在方法语法中:
var files = new[] { "xaml", "cs" }
.SelectMany(extension => Directory.GetFiles(generationDir, "*." + extension))
foreach(var file in files)
File.Delete(file);
从GetFiles
方法调用中删除filter参数,并在where子句中使用和or
:
var files = Directory.GetFiles(generationDir).Where(item => item.EndsWith(".cs") || item.EndsWith(".xaml"));
foreach (var file in files)
{
File.Delete(file);
}
var filenames = (new[] { "*.cs", "*.xaml" }).SelectMany(
ext => Directory.GetFiles(generationDir, ext));
foreach(var filename in filenames)
File.Delete(filename);
我还删除了多余的Where语句,因为您在传递给Directory.GetFiles
时使用了相同的条件进行双重筛选。
使用此运算符||
进行类似尝试
foreach (string file in Directory.GetFiles(generationDir, "*.*")
.Where(item => item.EndsWith(".xaml") || item.EndsWith(".cs"))
{
File.Delete(file);
}