C# リストの連結の測度

リストを要素とするリスト List> の要素を
全て連結させて1つのリストを作りたい。
例えば、{{3,2},{1,0},{-1}} を {3,2,1,0,-1} にしたい。


作戦とは2つ。

  1. 2重ループを用いて、要素の要素を全てリストに突っ込む
  2. Concat 関数を用いて、for 文1回で IEnumerable としてくっつけてから、ToList() をする。


後者の方が速いんじゃないかなぁとか思ったけど、
そんなことはなかった。


void Entry()
    {
        const int len = 1000;
        const int numElement = 10;

        List<int>[] lists = new List<int>[len];
        for (int i = 0; i < lists.Length; i++)
        {
            lists[i] = new List<int>();
            for (int k = 0; k < numElement; k++)
            {
                lists[i].Add(i + k);
            }//for k
        }//for i

        //全ての要素を見る
        Stopwatch sw = new Stopwatch();
        sw.Restart();
        List<int> a = new List<int>();
        foreach (var list in lists)
        {
            foreach (var v in list)
            {
                a.Add(v);
            }//foreach c
        }//foreach item
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);

        //リストのまま連結
        sw.Restart();
        IEnumerable<int> b = Enumerable.Range(0, 0);
        foreach (var list in lists)
        {
            b = b.Concat(list);
        }//foreach item
        List<int> c = b.ToList();
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);


        //本質とは関係ないコード
        long sum = 0;
        foreach (var item in a)
        {
            sum += item;
        }//foreach item
        Console.WriteLine(sum);
        foreach (var item in c)
        {
            sum += item;
        }//foreach item
        Console.WriteLine(sum);
    }