2009年12月31日木曜日

int型の配列を定義しLinqでデータを取得し、元の配列の順番を入れ替えてもLinqでは遅延実行の機能により入れ替えが反映されることを確認したり、遅延実行をToListによりLinqで取得したデータをListに変換することで回避したりしてみる。

using System;
using System.Collections.Generic;
using System.Linq;


class MainClass
{
    static void Main()
    {
        // int型のListを定義
        var num = new List<int>();
        int i = 0;
        // numに0から4の自然数を追加
        while (i < 5)
        {
            num.Add(i++);
        }
        // LINQによりデータを取得
        var linq = from n in num select n;
        // 出力値:0 1 2 3 4
        foreach (var n in linq)
        {
            Console.Write("{0} ", n);
        }
        // 改行
        Console.WriteLine();
        // numの0と1を入れ替える
        int tmp = 1;
        num[1] = 0;
        num[0] = tmp;
        /* 遅延実行の機能によりlinqにも
         * numの入れ替えが反映される
         * 出力値:1 0 2 3 4 */
        foreach (var n in linq)
        {
            Console.Write("{0} ", n);
        }
        Console.WriteLine();
        // 遅延実行を避けるためにlinqをListに変換
        linq = linq.ToList();
        // 出力値:1 0 2 3 4
        foreach (var n in linq)
        {
            Console.Write("{0} ", n);
        }
        Console.WriteLine();
        /* この時点でのnum
         * 出力値:1 0 2 3 4 */
        foreach (var n in num)
        {
            Console.Write("{0} ", n);
        }
        Console.WriteLine();
        // numの2と3を入れ替える
        int tmp1 = 2;
        num[2] = 3;
        num[3] = tmp1;
        // 出力値:1 0 3 2 4
        foreach (var n in num)
        {
            Console.Write("{0} ", n);
        }
        Console.WriteLine();
        /* linqは配列に変換されているので
         * 遅延実行を回避できる
         * 出力値:1 0 2 3 4 */
        foreach (var n in linq)
        {
            Console.Write("{0} ", n);
        }
        Console.WriteLine();
    }
}

0 コメント:

コメントを投稿