[C#] Linqと再帰でファイルの一覧表示でやった一覧の出し方、
こっちの方がよさそう
Func<DirectoryInfo, IEnumerable<string>> FileListUp = null; // (1)こうしておかないとエラーになる
FileListUp = dirInfo =>
{
return (from d in dirInfo.GetDirectories()
from f in FileListUp(d)
select f)
.Concat(from f in dirInfo.GetFiles()
select f.FullName);
};
var di = new DirectoryInfo(".");
var list = FileListUp(di); // ← (2)
// 表示する
list.ToList().ForEach(s => Console.WriteLine(s)); // ← (3)
なんでいいかというと、
感覚的に(2)で一覧が作成されそうだけど、遅延評価されて実際は(3)のToList()のタイミングで作成される。(2)のあとにlistに対してLinqを行ったりしたら、ToList()したあとに同じことをするよりも速く処理(高速に)されたする。
たとえば、(3)のところを
list.Take(10).ToList().ForEach(s => Console.WriteLine(s)); // ← (3')
に変えると、一覧の最初から10個が表示されるのだが前の[C#] Linqと再帰でファイルの一覧表示のFileListUpで同じことをやるよりも速く終わる。
コメント