Продолжая мое исследование выражения идей F # в С#, мне нужен оператор прямой пересылки. Для чего-либо, обернутого в IEnumerable, мы уже имеем его, как вы можете .NextFunc() для вашего сердечного контента. Но, например, если у вас есть сворачивание в конце, вы не можете передать результат этого в функцию.
Вот два метода расширения, я задавался вопросом, попробовал ли кто-нибудь еще это, и если это хорошая идея или нет (EDIT: теперь с Earwicker Maybe):
public static void Pipe<T>(this T val, Action<T> action) where T : class
{ if (val!=null) action(val); }
public static R Pipe<T, R>(this T val, Func<T, R> func) where T : class where R : class
{ return val!=null?func(val):null; }
Затем вы можете написать что-то вроде:
Func<string, string[]> readlines = (f) => File.ReadAllLines(f);
Action<string, string> writefile = (f, s) => File.WriteAllText(f, s);
Action<string, string> RemoveLinesContaining = (file, text) =>
{
file.Pipe(readlines)
.Filter(s => !s.Contains(text))
.Fold((val, sb) => sb.AppendLine(val), new StringBuilder())
.Pipe((o) => o.ToString())
.Pipe((s) => writefile(file, s));
};
(Я знаю, Filter == Where in С# и Fold == Aggregate, но я хотел свернуть свое, и я мог бы сделать WriteAllLines, но это не так)
EDIT: исправления в соответствии с комментарием в Earwicker (если я правильно понял).