Вы 'переопределяете' Систему. Linq. Агрегат с Вашим собственным дополнительным методом в пространстве имен MakeAggregateGoFaster.
, Возможно, специализированный на IEnumerable<string>
и использование StringBuilder?
, Возможно, взятие Expression<Func<string, string, string>>
вместо Func<string, string, string>
, таким образом, это может проанализировать дерево выражений и скомпилировать некоторый код, который использует StringBuilder вместо того, чтобы вызвать функцию непосредственно?
Просто предположение.
Почему бы не использовать одну из других форм Агрегата?
Enumerable.Range(0, size ).Aggregate(new StringBuilder(),
(a, b) => a.Append(", " + b.ToString()),
(a) => a.Remove(0,2).ToString());
можно указать любой тип для семени, выполнить любое форматирование, или заказные вызовы необходимы в первой лямбде, функционируют и затем настраивают выходной тип во второй функции лямбды. Созданные в функциях уже обеспечивают гибкость, в которой Вы нуждаетесь. Мои выполнения пошли от 1 444 мс до 6 мс.
Не ответ на вопрос, но я думаю, что стандартные шаблоны здесь должны использовать StringBuilder или строку. Соединение:
string.join(", ",Enumerable.Range(0, size).Select(n => n.ToString()).ToArray())
Ну, это зависело бы полностью от того, какой код находится в пространстве имен MageAggregateGoFaster, теперь не был бы он?
Это пространство имен не является частью времени выполнения.NET, таким образом, Вы связались в некотором пользовательском коде.
Лично я думал бы, что что-то, что распознает конкатенацию строк или подобный, и создает список, или подобный, затем выделяет один крупный StringBuilder, и использование Добавляет.
А грязное решение было бы:
namespace MakeAggregateGoFaster
{
public static class Extensions
{
public static String Aggregate(this IEnumerable<String> source, Func<String, String, String> fn)
{
StringBuilder sb = new StringBuilder();
foreach (String s in source)
{
if (sb.Length > 0)
sb.Append(", ");
sb.Append(s);
}
return sb.ToString();
}
}
}
грязный, потому что этот код, при выполнении, что Вы говорите Вас, испытывает с Вашей программой, не использует функцию-делегат вообще. Это, однако, снизит время выполнения приблизительно от 2 800 мс до 11 мс на моем компьютере и все еще приведет к тем же результатам.
Теперь, в следующий раз, возможно, необходимо ли задать реальный вопрос вместо всего взгляд, насколько умный я тип избиения груди?
Причина, которую я спросил, была ли это загадка, состояла в том, потому что загадке позволяют пожертвовать устойчивостью в различных степенях, пока это удовлетворяет букву установленной проблемы. Имея это в виду, здесь идет:
Решение 1 (выполнения немедленно, проблема не проверяет):
public static string Aggregate(this IEnumerable<string> l, Func<string, string, string> f) {
return "";
}
Решение 2 (выполнения о с такой скоростью, как проблема требует, но игнорирует делегата полностью):
public static string Aggregate(this IEnumerable<string> l, Func<string, string, string> f) {
StringBuilder sb = new StringBuilder();
foreach (string item in l)
sb.Append(", ").Append(item);
return sb.Remove(0,2).ToString();
}