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.*/