Chr*_*ris 5 .net c# lambda c#-3.0
这可能很简单,但我对Lambda很新,所以请耐心等待.
我有一个使用Lambda函数递归的函数.主函数接收一个bool,告诉它在lambda中包含某些信息.
该函数旨在为XML写出一个自定义类 - 我认为代码非常自我解释.
目前我已经使用一个简单的if语句克服了这个问题,但感觉很丑,所以想知道是否有人知道更好的方法?
private XElement ErrorListToXml(ErrorList el, bool outputTagsOnly)
{
// Need to declare in advance to call within the lambda.
Func<ErrorType, XElement> recursiveGenerator = null;
if (outputTagsOnly)
recursiveGenerator = error => new XElement
(error.Name,
error.ChildErrors.Select(recursiveGenerator));
else
recursiveGenerator = error => new XElement
(error.Name,
new XAttribute("Ignore", error.Filter),
error.ChildErrors.Select(recursiveGenerator));
var element = new XElement
("ErrorList",
ChildErrors.Select(recursiveGenerator));
Console.WriteLine(element);
return element;
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以安全地在lambda函数中移动"if"语句:
Func<ErrorType, XElement> recursiveGenerator = null;
recursiveGenerator = (error =>
outputTagsOnly
? new XElement(error.Name,
error.ChildErrors.Select(recursiveGenerator));
: new XElement(error.Name, new XAttribute("Ignore", error.Filter),
error.ChildErrors.Select(recursiveGenerator)));
var element = new XElement("ErrorList", ChildErrors.Select(recursiveGenerator));
Run Code Online (Sandbox Code Playgroud)
除此之外,似乎没有任何简单的方法来简化你所拥有的.
(PS当它看起来很丑的时候,通过漂亮的印刷在猪身上涂一些口红;)
您可以很容易地在lambda中的相同类型的值之间做出决定:
customer => flag ? customer.Name : customer.Address
Run Code Online (Sandbox Code Playgroud)
您可以在lambda中使用if语句,并且需要更多努力:
customer =>
{
if (flag)
return customer.Name
else
return customer.Address
}
Run Code Online (Sandbox Code Playgroud)
这些都不会对您的方法有很大帮助.
mquander的解决方案可以略微改进,以减少重复.您可以使用以下事实:您可以传入nullXElement构造函数内容中的元素,并忽略它.因此,我们可以进一步推动这一条件:
Func<ErrorType, XElement> recursiveGenerator = null;
recursiveGenerator = (error => new XElement(error.Name,
outputTagsOnly ? null : new XAttribute("Ignore", error.Filter),
error.ChildErrors.Select(recursiveGenerator));
var element = new XElement("ErrorList", ChildErrors.Select(recursiveGenerator));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24698 次 |
| 最近记录: |