Обновить - для тех, кто имеет преувеличенное настроение, вы можете предположить, что Aggregate все равно производит нормальный результат, независимо от того, какая функция передана ему, в том числе в случае оптимизации.
Я написал эту программу для создания длинной строки целых чисел от 0 до 19999 по запятой.
using System;
using System.Linq;
using System.Diagnostics;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
const int size = 20000;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + ", " + b);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds + "ms");
}
}
}
Когда я запустил его, он говорит:
5116ms
Более пяти секунд, ужасно. Конечно, это потому, что вся строка копируется каждый раз вокруг цикла.
Но что, если сделать одно очень небольшое изменение, указанное комментарием?
using System;
using System.Linq;
using System.Diagnostics;
namespace ConsoleApplication5
{
using MakeAggregateGoFaster; // <---- inserted this
class Program
{
static void Main(string[] args)
{
const int size = 20000;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + ", " + b);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds + "ms");
}
}
}
Теперь, когда я запустил его, он говорит:
42ms
Более 100 раз быстрее.
Вопрос
Что в пространстве имен MakeAggregateGoFaster?
Обновление 2: Написал мой ответ здесь.