Tubo para a frente em C #
Continuandominha investigação de expressar idéias de F # em C #, eu queria um operador de encaminhamento de canal. Para qualquer coisa envolvida em um IEnumerable, já o temos, como você pode .NextFunc () no conteúdo do seu coração. Mas, por exemplo, se você tiver alguma redução de dobra no final, não poderá alimentar o resultado disso em uma função.
Aqui estão dois métodos de extensão, eu me perguntei se alguém havia tentado isso e se é uma boa ideia ou não (EDIT: agora comTalvez de Earwicker incluído):
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; }
Você pode escrever algo como:
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));
};
(Eu sei, Filter == Where in C # e Fold == Aggregate, mas eu queria fazer o meu próprio, e eu poderia ter feito WriteAllLines, mas esse não é o ponto)
EDIT: correções de acordo com o comentário de Earwicker (se eu entendi corretamente).