献立の中からカツを探し出すプログラム(LINQ)

<はじめに>
今週の献立の中で何曜日のメニューがカツなのか気になって仕方がない時ありますよね?
そこで、IEnumerableを実装した自作クラスを作って、LINQの恩恵を受けつつカツの曜日を抽出することにしました。


<プログラム>

class Program
{
    static void Main(string[] args)
    {
        MySampleClass<string> mySampleInstance = new MySampleClass<string>();

        mySampleInstance.Add("月:カレー");
        mySampleInstance.Add("火:トンカツ");
        mySampleInstance.Add("水:ラーメン");
        mySampleInstance.Add("木:スパゲティ");
        mySampleInstance.Add("金:メンチカツ");

        Console.WriteLine("// 今週の献立は…");

        //--------------------------------------------------
        // foreachにてデータを取得
        //
        foreach (var item in mySampleInstance)
        {
            Console.WriteLine(item);
        }

        //--------------------------------------------------
        // LINQにてデータを取得
        //
        var list = mySampleInstance.Where(p => p.Contains("カツ")).Select(p => p.Split(':'));

        Console.WriteLine("// カツの曜日は…");

        foreach (var item in list)
        {
            Console.WriteLine(item[0] + "曜日");
        }
    }
}

class MySampleClass<T> : IEnumerable<T>
{
    //--------------------------------------------------
    // クラス変数(List)
    //
    private List<T> myList = new List<T>();

    //--------------------------------------------------
    // 要素を追加
    //
    public void Add(T tempItem)
    {
        myList.Add(tempItem);
    }

    //--------------------------------------------------
    // IEnumerable<T>.GetEnumeratorメソッドを実装(必須)
    //
    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < myList.Count; i++)
        {
            yield return myList[i];
        }
    }

    //--------------------------------------------------
    // IEnumerable.GetEnumeratorメソッドを実装(必須)
    //
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    } 
}


<実行結果>
f:id:nomurabbit:20131018223556p:plain


<まとめ>
IEnumerableを実装するときに注意するべきは、ジェネリック型、非ジェネリック型に対応したGetEnumerator()メソッドを定義することだと思います。このあたり「yieldって何ぞ?」状態だとさっぱりだと思うのですが、何回か自分で書いてるうちになんとなくわかってくると思います。それにしてもLINQ × ラムダ式の組み合わせは感覚的に書けるので気持ちがいいですね~♪