Подтвердить что ты не робот

Directory.GetFiles определенного расширения

Есть ли способ упростить это выражение linq, или есть лучший способ сделать это?

Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
         .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
                     ...);

В основном я хочу вернуть все файлы определенного расширения. К сожалению, этот метод не очень гибкий. Я предпочел бы добавить расширения в список, и Directory.GetFiles вернет эти расширения. Возможно ли это?

4b9b3361

Ответ 1

Если вы хотите сделать свою фильтрацию в LINQ, вы можете сделать это следующим образом:

var ext = new List<string> {"jpg", "gif", "png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
     .Where(s => ext.Contains(Path.GetExtension(s)));

Теперь ext содержит список разрешенных расширений; вы можете добавлять или удалять элементы, необходимые для гибкой фильтрации.

Ответ 2

Не делает ли это перегрузка Directory.GetFiles(String, String)? Вы просто сделали бы Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)

Если вы хотите поместить их в список, просто замените "*.jpg" на переменную, которая выполняет итерацию по списку и агрегирует результаты в общий результирующий набор. Гораздо яснее, чем индивидуально их указывать. =)

Что-то вроде...

foreach(String fileExtension in extensionList){
    foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){
        allFiles.Add(file);
    }
}

(Если ваши каталоги велики, использование EnumerateFiles вместо GetFiles потенциально может быть более эффективным)

Ответ 3

Я бы использовал только одну строку, например

List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
      .Where(file => new string[] { ".jpg", ".gif", ".png" }
      .Contains(Path.GetExtension(file)))
      .ToList();