English 中文(简体)
如果在Lambda语中发言的话?
原标题:
  • 时间:2009-06-03 13:48:11
  •  标签:

这可能非常简单,但我对Lambda的这种说法很新。

I have a function that uses a Lambda function to recurse. The main function receives a bool telling it to include certain information or not within the lambda.

该职能旨在向XML书写一个习俗类别——我认为,该守则只是自我解释。

此时,如果说的话,我就用简单的方式来解决这一问题,但我感到很奇怪的是,谁知道更好的方式?

        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;
    }
最佳回答

为减少重复,可以稍微改进浪费的解决办法。 您可以使用以下事实:你可在<代码>null上通过XElement Constructionor内容中的一个要素,而且该内容被忽视。 因此,我们可以进一步推动以下条件:

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));
问题回答

你可以很容易地在lam贝达作出相同价值的决定:

customer => flag ? customer.Name : customer.Address

你们如果在一次辩论会上发言,可以做一点更多的努力:

customer =>
{
  if (flag)
    return customer.Name
  else
    return customer.Address
}

这两种方法都无助于你的方法。

如果你愿意的话,你可以安全地将“如果”声明移至“拉姆布达”。

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));

除此以外,似乎没有任何微薄的方法来简化你所说的话。

(P.S.,当它看上去时,用粗略的印法对图西略加一字;)

我猜想你能够这样做,但归根结底,它仍然有:

                recursiveGenerator = error => outputTagsOnly ? 
                   new XElement(error.Name,error.ChildErrors.Select(recursiveGenerator)
              : 
              new XElement(error.Name,new XAttribute("Ignore", error.Filter), 
             error.ChildErrors.Select(recursiveGenerator);

你可以试图把你的问题分为两大问题:

  1. How to build a tree from errors structure.
  2. What to put into the tree nodes.

然后,该法典将考虑:

        private XElement ErrorListToXml(ErrorList el, bool outputTagsOnly)
        {
            // Need to declare in advance to call within the lambda.
            Func<ErrorType, XElement> treeGenerator = null;
            Func<ErrorType, object[]> elementParametersGenerator = null;

            treeGenerator = error => new XElement
                (error.Name,
                elementParametersGenerator(error));

            if(outputTagsOnly)
                elementParametersGenerator = error => 
                    new object[] {error.ChildErrors.Select(treeGenerator)};
            else
                elementParametersGenerator = error => 
                    new object[] { new XAttribute("Ignore", error.Filter), error.ChildErrors.Select(treeGenerator) };

            var element = new XElement
                       ("ErrorList",
                        ChildErrors.Select(treeGenerator));

            Console.WriteLine(element);

            return element;
        }

在这种特定情况下,情况并不明显好转,而是采取更为一般性的做法。





相关问题
热门标签