LINQ クエリのパフォーマンスに問題があるため、以下の問題を示すために簡単な例を作成しました。このコードは、小さい整数のランダムなリストを受け取り、合計が 10 以下のいくつかの小さなリストに分割されたリストを返します。
問題は、(私がこれを書いたように) コードが N で指数関数的に長くかかることです。これは O(N) の問題にすぎません。N=2500 の場合、私の PC でコードを実行するには 10 秒以上かかります。
誰かが何が起こっているのかを説明できれば、私は大いに感謝します。ありがとう、マーク。
int N = 250;
Random r = new Random();
var work = Enumerable.Range(1,N).Select(x => r.Next(0, 6)).ToList();
var chunks = new List<List<int>>();
// work.Dump("All the work."); // LINQPad Print
var workEnumerable = work.AsEnumerable();
Stopwatch sw = Stopwatch.StartNew();
while(workEnumerable.Any()) // or .FirstorDefault() != null
{
int soFar = 0;
var chunk = workEnumerable.TakeWhile( x =>
{
soFar += x;
return (soFar <= 10);
}).ToList();
chunks.Add(chunk); // Commented out makes no difference.
workEnumerable = workEnumerable.Skip(chunk.Count); // <== SUSPECT
}
sw.Stop();
// chunks.Dump("Work Chunks."); // LINQPad Print
sw.Elapsed.Dump("Time elapsed.");