Pipe vorwärts in C #
Auch weiterhin meine Untersuchungm F # -Ideen in C # auszudrücken, wollte ich einen Pipe-Forward-Operator. Für alles, was in IEnumerable eingeschlossen ist, haben wir es bereits, wie Sie können .NextFunc () nach Herzenslust. Wenn Sie zum Beispiel am Ende eine faltenartige Reduzierung haben, können Sie das Ergebnis nicht in eine Funktion einspeisen.
Hier sind zwei Erweiterungsmethoden, ich habe mich gefragt, ob jemand anderes dies versucht hat und ob es eine gute Idee ist oder nicht (EDIT: jetzt mit Earwicker's Vielleicht inbegriffen)
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; }
Sie können dann etwas schreiben wie:
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));
};
(Ich weiß, Filter == Where in C # und Fold == Aggregate, aber ich wollte meine eigenen rollen, und ich hätte WriteAllLines tun können, aber das ist nicht der Punkt)
EDIT: Korrekturen gemäß Earwickers Kommentar (wenn ich das richtig verstanden habe).