代码之家  ›  专栏  ›  技术社区  ›  Chris

Lambda函数中的If语句?

  •  8
  • Chris  · 技术社区  · 17 年前

    该函数旨在为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;
        }
    
    5 回复  |  直到 17 年前
        1
  •  6
  •   Jon Skeet    17 年前

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

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

        2
  •  6
  •   mqp    17 年前

    mquander的解决方案可以稍作改进以减少重复。你可以利用你可以通过的事实 null XElement构造函数内容中的一个元素,它将被忽略。因此,我们可以将条件进一步移动到:

    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));
    
        3
  •  6
  •   Amy B    17 年前

    如果你愿意,你可以在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));
    

        4
  •  0
  •   BFree    17 年前

    我想你可以做到这一点,但归根结底,这仍然是一个假设:

                    recursiveGenerator = error => outputTagsOnly ? 
                       new XElement(error.Name,error.ChildErrors.Select(recursiveGenerator)
                  : 
                  new XElement(error.Name,new XAttribute("Ignore", error.Filter), 
                 error.ChildErrors.Select(recursiveGenerator);
    
        5
  •  0
  •   Massimiliano    17 年前

    您可以尝试将问题分解为两个不同的问题:

    1. 如何从错误结构构建树。
    2. 将什么放入树节点中。

    然后代码看起来像:

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

    在这种特殊情况下,情况并没有明显好转,但这是一种更通用的方法。

    推荐文章