У меня возникла проблема с выполнением запроса LINQ, поэтому я создал небольшой упрощенный пример, чтобы продемонстрировать проблему ниже. Код принимает случайный список небольших целых чисел и возвращает список, разбитый на несколько меньших списков, каждый из которых составляет 10 или меньше.
Проблема заключается в том, что (как я это написал) код занимает экспоненциально больше с N. Это только проблема O (N). При N = 2500 код занимает 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.");