Iteratorの使いどころ
ディレクトリ走査みたいな処理に威力を発揮しそう。
#region Using directives using System; using System.IO; using System.Collections.Generic; #endregion namespace ConsoleApplication1 { delegate bool Predicate(FileSystemInfo fsi); class Program { static IEnumerable<FileSystemInfo> GetFiles(string path) { DirectoryInfo di = new DirectoryInfo(path); foreach (FileSystemInfo fsi in di.GetFileSystemInfos()) { yield return fsi; // サブディレクトリも走査 if (fsi is DirectoryInfo) foreach (FileSystemInfo fsi2 in GetFiles(fsi.FullName)) yield return fsi2; } } static IEnumerable<FileSystemInfo> Find(IEnumerable<FileSystemInfo> g, Predicate pred) { foreach (FileSystemInfo fsi in g) if (pred(fsi)) yield return fsi; } static void Main(string[] args) { int cnt = 0; string path = @"C:\Windows"; string ext = ".dll"; // ファイルを見つける条件 Predicate pred = delegate(FileSystemInfo f) { if (f.Extension.Equals(ext, StringComparison.CurrentCultureIgnoreCase)) { // カウントする ++cnt; // 拡張子が.DLL return true; } return false; }; // pathで指定したディレクトリから条件predを満たすファイルを列挙 foreach (FileSystemInfo fsi in Find(GetFiles(path), pred)) Console.WriteLine(fsi.FullName); // 件数を表示 Console.WriteLine("{0} has {1} {2} files.", path, cnt, ext); Console.ReadLine(); } } } /* 結果 DLLの列挙は省略 ... C:\Windows has 4757 .dll files.*/