Я недавно считал ту.NET 4 Система. Строковый класс имеет новую перегрузку метода Соединения. Эта новая перегрузка берет разделитель, и IEnumerable
который позволяет произвольным наборам быть присоединенными в единственную строку без потребности преобразовать в промежуточный массив строк.
Круто! Это означает, что я могу теперь сделать это:
var evenNums = Enumerable.Range(1, 100)
.Where(i => i%2 == 0);
var list = string.Join(",",evenNums);
... вместо этого:
var evenNums = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.Select(i => i.ToString())
.ToArray();
var list = string.Join(",", evenNums);
... таким образом экономя на преобразовании каждого объекта к строке и затем выделении массива.
Однако будучи вентилятором функционального стиля программирования в целом и объединения в цепочку метода в C#, в частности, я предпочел бы мочь записать что-то вроде этого:
var list = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.string.Join(",");
Это не легальный C# все же. Да, я мог сделать это с Enumerable.Aggregate
, и да, я мог сделать это со своим собственным методом расширения Соединения), но те подходы трудны к чтению / неэффективны и чувствуют себя подобно отговорке (соответственно), таким образом, я хотел бы попытаться сделать его другой путь. Самое близкое, которое мне удалось получить до сих пор, это:
var list = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.ApplyTo(
Functional.Curry, string>
(string.Join)(",")
);
... использование следующих дополнительных методов:
public static class Functional
{
public static TRslt
ApplyTo(this TArg arg, Func func)
{
return func(arg);
}
public static Func>
Curry(this Func func)
{
Func, Func>> curried
= f => x => y => f(x, y);
return curried(func);
}
}
Это является довольно подробным, требует явного определения параметров и типа возврата строки. Перегрузка соединения я хочу использовать, и полагается на функции различия C#4, потому что мы определяем один из аргументов как IEnumerable, а не IEnumerable.
Можно ли найти более опрятный способ достигнуть этого использования объединяющего в цепочку метод стиля программирования?
Эта проблема о попытке найти краткий путь, в C#, приправить карри функцию, которая имеет несколько перегрузок - и это только для забавы!
Что не так с:
var list = string.Join(",",Enumerable.Range(1, 100).Where(i => i%2 == 0));
Я действительно не понимаю, почему это не так функциональное программирование. Это меньше цепочек, правда. Но функциональная программа не связана с цепочкой, а с написанием более декларативных операторов, что и делается в моей книге. Конечно, если вы действительно хотите, чтобы он был связан цепочкой, вы можете сделать следующее: Каким LINQ-способом можно взорвать / присоединить массив строк?