C# リストの連結の測度
リストを要素とするリスト List> の要素を
全て連結させて1つのリストを作りたい。
例えば、{{3,2},{1,0},{-1}} を {3,2,1,0,-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); }