合并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表达式不太满意,所以在这里遇到了困难。。。

合并2个foreach循环(删除具有特定扩展名的文件)

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); 
                 }