Объединить 2 цикла foreach (удаление файлов с определенными расширениями) - PullRequest
2 голосов
/ 18 ноября 2011

Я получил следующий код:

foreach (string file in Directory.GetFiles(generationDir, "*.xaml")
{
    File.Delete(file);
}

foreach (string file in Directory.GetFiles(generationDir, "*.cs")
{
    File.Delete(file);
}

Я хотел бы объединить эти 2 foreach в один цикл? Это возможно ? Меня не устраивает лямбда-выражение, поэтому здесь трудно ...

Ответы [ 6 ]

2 голосов
/ 18 ноября 2011
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 на коллекцию начнется новое перечисление.

1 голос
/ 18 ноября 2011

Как насчет 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);
1 голос
/ 18 ноября 2011

Вы можете просто объединить два набора

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.

0 голосов
/ 18 ноября 2011
var filenames = (new[] { "*.cs", "*.xaml" }).SelectMany(
    ext => Directory.GetFiles(generationDir, ext));

foreach(var filename in filenames)
    File.Delete(filename);

Я также удалил избыточные операторы Where, поскольку вы выполняли двойную фильтрацию по тем же критериям, что и в Directory.GetFiles.

0 голосов
/ 18 ноября 2011

попробуйте так с помощью этого оператора ||

 foreach (string file in  Directory.GetFiles(generationDir, "*.*") 
                .Where(item => item.EndsWith(".xaml") || item.EndsWith(".cs")) 
                 { 
                    File.Delete(file); 
                 } 
0 голосов
/ 18 ноября 2011

Удалите аргумент фильтра из вызова метода GetFiles и используйте и or в предложении where:

var files = Directory.GetFiles(generationDir).Where(item => item.EndsWith(".cs") || item.EndsWith(".xaml"));
foreach (var file in files)
{
     File.Delete(file);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...