1. ホーム
  2. c#

[解決済み] Directory.EnumerateFilesを複数条件でフィルタリングする方法は?

2023-06-04 17:40:12

質問

次のようなコードがあります。

List<string> result = new List<string>();

foreach (string file in Directory.EnumerateFiles(path,"*.*",  
      SearchOption.AllDirectories)
      .Where(s => s.EndsWith(".mp3") || s.EndsWith(".wma")))
       {
          result.Add(file);                 
       }

これは問題なく動作し、私が必要とすることを行っています。1 つの小さなことを除いては。私は、複数の拡張子でフィルタリングするためのより良い方法を見つけたいと思います。 私はこのようなフィルタと文字列配列を使用したいと思います。

string[] extensions = { "*.mp3", "*.wma", "*.mp4", "*.wav" };

NET Framework 4.0/LINQを使用して、これを行う最も効率的な方法は何でしょうか?何か提案はありますか?

私は時折プログラマーであるどんな助けでも感謝します:-)

どのように解決するのですか?

これを解決するために、私はいくつかのヘルパーメソッドを作成しました。 ブログ をご覧ください。

1つのバージョンでは、正規表現のパターン \.mp3|\.mp4 を受け取り、もう一方は文字列リストを受け取り、並列に実行されます。

public static class MyDirectory
{   // Regex version
   public static IEnumerable<string> GetFiles(string path, 
                       string searchPatternExpression = "",
                       SearchOption searchOption = SearchOption.TopDirectoryOnly)
   {
      Regex reSearchPattern = new Regex(searchPatternExpression, RegexOptions.IgnoreCase);
      return Directory.EnumerateFiles(path, "*", searchOption)
                      .Where(file =>
                               reSearchPattern.IsMatch(Path.GetExtension(file)));
   }

   // Takes same patterns, and executes in parallel
   public static IEnumerable<string> GetFiles(string path, 
                       string[] searchPatterns, 
                       SearchOption searchOption = SearchOption.TopDirectoryOnly)
   {
      return searchPatterns.AsParallel()
             .SelectMany(searchPattern => 
                    Directory.EnumerateFiles(path, searchPattern, searchOption));
   }
}