У меня результаты под .NET Core аналогичные Вашим, так что выкладывать не буду. А вот под .NET Framework ситуация другая:
В .NET Core ToArray и ToList были оптимизированы:
Многие linq операторы начали возвращать не голый IEnumerable, а IIListProvider, в котором есть информация о количестве элементов в последовательности. Это позволяет сразу выделять под массив/список нужное количество памяти. В Вашем бенчмарке это как раз и проявилось — Repeat точно знает, сколько элементов будет в последовательности, а Select эту информацию передаёт дальше.
ToArray для материализации последовательностей неизвестной длины стал использовать хитрые оптимизации. В определённый момент он переходит от использования одного промежуточного буфера с его ресайзом к списку буферов, что уменьшает memory traffic.
А в .NET Framework всё работает так как описал KvanTTT, поэтому ToList там аллоцирует меньше.
Восемь титек, восемь ног,
Три п...ы и пара рог!
(Две доярки и корова)
CancellationTokenSource
не структура, это класс.В .NET Core ToArray и ToList были оптимизированы:
А в .NET Framework всё работает так как описал KvanTTT, поэтому ToList там аллоцирует меньше.
Выложите, пожалуйста, код бенчмарка, сравнивающего ToList и ToArray.