【发布时间】:2011-05-09 22:23:37
【问题描述】:
给定一个Func<string, string> 的列表,是否可以编写一个循环遍历列表并返回结果的语句,如下所示:
string result = f1(f2(f..(input));
我有以下代码(有效),但我对临时变量不满意。
public static string WrapEachElementWith<T>
( this IEnumerable<T> target,
params Func<string, string>[] func )
{
string result = string.Empty;
target.Each(s =>
{
var tmp = s.ToString();
func.Reverse().Each(x => tmp = x(tmp));
result += tmp;
});
return result;
}
如何简化/重构?
更新: 我应该提供更多的背景。在看到高阶 JavaScript 会话和 John 在 Oredev 的滥用 c# 会话后,我正在使用 c# 中的函数式编程。
目的是生成html。
var TABLE = WrapWith("TABLE");
var TR = WrapWith("TR");
var TD = WrapWith("TD");
const string expected = "<TABLE><TR><TD>1</TD></TR><TR><TD>2</TD></TR></TABLE>";
var result = TABLE(stringArray.WrapEachWith(TR, TD));
result.ShouldEqual(expected);
static Func<String, String> WrapWith(string element)
{
var startTag = '<' + element + '>';
var endTag = "</" + element + '>';
return s => startTag + s + endTag;
}
【问题讨论】:
-
递归?
applyMany s [] = s之类的东西;applyMany s (f:fs) = applyMany (f s) fs在 C# 中? -
出于好奇,您使用递归的原因是什么?
-
查看我的问题中的更新,我正在尝试使用要包装的元素列表将元素包装在 HTML 中
-
我在问题更新中犯了一个错误,它现在有有效的代码。
-
您不会以这种方式生成 HTML。就像您不手动解析 XML 一样,更不用说使用正则表达式了。这个问题太复杂了,已经解决了,你手动解决它。
标签: c# linq recursion functional-programming