概要
一口で言ってしまうと、DirectoryInfo
のEnumerateFiles
使うときにSearchPattern
が指定できますけど、複数のパターンを指定したくなったよー
って話です
これには、大きく分けて二つの方法があります
つまり、先に絞るか・後で絞るか―――
先に絞る
先に絞る方は、個々のSearchPattern
をEnumerateFiles
に与えて、得られた結果を統合するやり方、ですね
こちらの方式の長所は、EnumerateFiles(SearchPattern)
を利用するので、プログラムとして分かりやすいとこでしょうかねぇ、いろんな意味でね
短所は、ここのSearchPattern
が実は謎仕様である点
こちらにある様な謎を秘めているらしいです
総合的には、それらひっくるめてWindows
の標準的な動作と一致している安心感が得られるんじゃないでしょうか(良し悪しは別にして)、と思ってます
後で絞る
後で絞るのは、SearchPattern
を指定せず全ての結果を受け入れたうえで、複数のSearchPattern
に合致するファイルだけに着目する方式
こちらの問題点はSearchPattern
の取り扱いでしょうか
結局、SearchPattern
を正規表現と見立ててフィルタを自作することになり、色々面倒そう
謎仕様のSearchPattern
を完全に踏襲するのは更に難しそうです
利点としては、謎仕様ぶん投げて独自仕様の明確なSearchPattern
を確立できるとこでしょう、裏っ返しですけど
で、効率的なのはどっち?
という観点では、実装の仕方だけではなく、母集団の状況とフィルタの関連性から、一義的に決まるものではない
と勝手に結論付けました
ではどうするのが一番楽な方法だろうか?
以下ではこの観点で結論を導き出しました
結局
「先に絞る」一択です、圧倒的に楽なのは
SearchPattern
の解釈をWindows
側に押し付けちゃえますからね
先に絞ってから ⇒ 統合する、って云うのがなんとなくめんどくさそうな響きがありますけど、実はこいつもLinq
にお任せすれば1行で書けます
それが、こちら!
"*.pdf;*.ppt;*.png".Split(';')
.SelectMany(filter => new DirectoryInfo("フォルダパス").EnumerateFiles(filter))
しまった、2行になってしまった…
いやー、たった2行書くのに引っ張ったなー