如果在Lambda函数中声明?

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)

mqp*_*mqp 6

如果您愿意,可以安全地在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当它看起来很丑的时候,通过漂亮的印刷在猪身上涂一些口红;)


Amy*_*y B 6

您可以很容易地在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)

这些都不会对您的方法有很大帮助.


Jon*_*eet 6

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)