Мне кажется, ты делаешь четыре вещи:
- Преобразование каждого элемента в строку
- Применение функций по очереди
- Применение этой составной функции к каждой строке в последовательности
- Объединение результатов (неэффективно)
Я бы выделил эти четыре аспекта - в частности, string.Join
работает достаточно хорошо для четвертой части, а Enumerable.Select
- для третьей.
Я бы также не стал менять порядок операций - я ожидаю, что первая указанная операция будет первой, лично примененной.
Итак, я бы переписал этот метод на return a Func<string, string>
, который затем мог бы использоваться с Select
и Join
. Например:
public static Func<string, string> Compose(params Func<string, string> funcs)
{
return input => {
string current = input;
foreach (var func in funcs)
{
current = func(current);
}
return current;
};
}
Конечно, вы могли бы сделать это само по себе, с подписью:
public static Func<T, T> Compose(params Func<T, T> funcs)
Затем вы бы назвали это чем-то вроде:
var composite = Compose<string>(FirstFunction, SecondFunction, ThirdFunction);
var query = string.Join("", items.Select(x => x.ToString())
.Select(composite));