Труба вперед в C #
продолжающийсямое расследование для выражения идей F # в C #, я хотел оператор прямого канала. Для всего, что обернуто в IEnumerable, у нас уже есть это, как вы можете .NextFunc () к вашему сердцу. Но, например, если у вас есть какое-то складчатое сокращение в конце, вы не можете передать результат этого в функцию.
Вот два метода расширения, я хотел бы знать, пробовал ли кто-то еще, и если это хорошая идея или нет (РЕДАКТИРОВАТЬ: теперь сEarwicker Может быть в комплекте):
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 == Где в C # и Fold == Aggregate, но я хотел свернуть свой собственный, и я мог бы сделать WriteAllLines, но это не главное)
РЕДАКТИРОВАТЬ: исправления согласно комментарию Earwicker (если я правильно понял).