2014年6月26日木曜日

C#応用 – LINQプログラミング 7


さて、C#応用 LINQプログラミング

第7回である。

ウォッチは 変数を選んで

Ctrl + Q


ForEachメソッド
.NET Framework 3.5のコレクションクラスから

ForEachメソッドが追加された。

List<int> l = new List<int>();

l.Add(1);
l.Add(2);
l.Add(3);

l.ForEach((int i) => { Console.WriteLine(i); });

FoaEachメソッドに繰り返しを行いたい処理のdelegateを渡すことができるメソッドである。

自作すると、このような形式である。

public class Range
{
    public static ForEach(int from, int to, Action<int> act)
    {
        for(int i = from; int <= to; i++) act(1);
    }
}

// 別メソッド
Range.ForEach(0, 10, (i) => { Console.WriteLine("{0}", i); });


yeildとは?
IEnumeratorを実装するクラスの自動生成を行う。

    public class Counter : IEnumerable<int>
    {
        public int CountStop;

        // ジェネリックのIEnumeratorを利用
        public IEnumerator<int> GetEnumerator()
        {
            for (int i = 1; i <= CountStop; i++)
            {
                yield return i;
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

動作としては、処理の中断である。

仮にCountStopに 10 をセットすると、先ほどのクラスは以下と同等である。

public class Counter : IEnumerable
{
    public IEnumerator<int> GetEnumerator()
    {
        yield return 1;
        yield return 2;
        yield return 3;
        yield return 4;
        yield return 5;
        yield return 6;
        yield return 7;
        yield return 8;
        yield return 9;
        yield return 10;
    }
}

列挙を意図的に中断する場合は、yield breakを使用する。

public class Counter : IEnumerable
{
    public IEnumerator<int> GetEnumerator()
    {
        int i++;
        if (i > 5) yield break;
        yield return i;
    }
}

yield は予約語ではない。(下位互換のため)

yield return や yield break と組み合わせることで構文として意味を持つようになる。


今日の名言
人生はまさにブーメランだ。人に与えたものは手元に返ってくる。
                          デール・カーネギー

誰でも悩みや恐怖やさまざまの病気を追放できる。そして自分の心の
持ち方を変えることにより、人生を一変させることができる。私には
わかっているのだ!なぜなら、そうしたまさかと思われるような変容が
実際に起こるのをこの目で何度も見届けてきたから。あまりにもたくさん
見すぎて、もはや大して驚かないくらいだ。
                          デール・カーネギー

自分の今行っていること、行ったことを心から楽しめるものは幸福である。
                          ヨハン・ウォルフガング・フォン・ゲーテ

ありとあらゆるものに心から興味を持ち、自分の道を歩むに従ってどんな時と
機会が手を差し伸べているかをとらえる目を持ち、自分の手を置けるものは
何物も逃さない者、そうした人間は、短い人生のうちに何と多くの素晴らしい
冒険を手に入れることだろうか!
                          ローレンス・スターン