代码之家  ›  专栏  ›  技术社区  ›  Richard Ev

foreach(…in…)或.foreach();这是问题[重复]

  •  13
  • Richard Ev  · 技术社区  · 15 年前

    可能重复:
    C# foreach vs functional each

    这是一个关于可读性编码的问题。

    我有一个 XDocument 和A List<string> 包含我需要屏蔽的敏感信息的元素的名称(在本例中替换为下划线)。

    XDocument xDoc;
    List<string> propertiesToMask;
    

    这可以用两种方式编写,使用传统的 foreach 循环,或使用 .ForEach 使用lamba语法的方法。

    foreach (string propertyToMask in propertiesToMask)
    {
        foreach (XElement element in xDoc.Descendants(propertyToMask))
        {
            element.SetValue(new string('_', element.Value.Length));
        }
    }
    

    propertiesToMask
        .ForEach(propertyToMask => xDoc.Descendants(propertyToMask).ToList()
            .ForEach(element => element.SetValue(new string('_', element.Value.Length))));
    

    你认为哪种方法最易读,为什么?如果您更喜欢第二个示例,那么为了最大的可读性,您将如何呈现它?

    6 回复  |  直到 15 年前
        1
  •  14
  •   corymathews    15 年前
    foreach (string propertyToMask in propertiesToMask)
    {
        foreach (XElement element in xDoc.Descendants(propertyToMask))
        {
            element.SetValue(new string('_', element.Value.Length));
        }
    }
    

    因为间隔使得扫描非常简单。第二个远远不够杂乱,我必须真正阅读它。

        2
  •  14
  •   Community CDub    8 年前

    Eric Lippert 有一个 good entry about this on his blog . 总之,这项任务是由 ForEach 是产生副作用,这可能不是一个理想的事情与功能风格的编程在C。

        3
  •  4
  •   Reed Copsey    15 年前

    我非常喜欢第一个,有三个原因。

    首先,它更高效(在第二种情况下,您有额外的tolist()调用)。

    其次,在我看来,它更具可读性。

    最后,我建议你阅读 Eric Lippert's blog post on this subject. 有哲学上的理由可以避免 List<T>.ForEach 因为它的全部目的是产生副作用,即使它有一个功能性的风格。

        4
  •  4
  •   Daniel Brückner    15 年前

    传统的方法具有很容易调试的优点。但我个人更喜欢 ForEach() 在这种情况下接近。在我看来,很难调试用流利语言编写的代码的情况仍然是可用工具的缺陷,而不是编码风格。根据我个人的经验,这种方法的错误率很低,因此它不是真正的大问题。

    我将编写一些扩展方法,生成以下代码。

    propertiesToMask
       .SelectMany(property => document.Descendants(property))
       .ForEach(element => element.MaskValue());
    
        5
  •  1
  •   Rauhotz    15 年前

    第一个可以在调试器运行时更改,Visual Studio允许您继续调试。在更改.foreach变量之后,您必须重新启动调试会话并重新编译,因为它包含lambda表达式(与2008相比)。

        6
  •  0
  •   Tad Donaghe    15 年前

    这是一个非常主观的答案:

    我不太同意不喜欢背后的哲学推理。可能是我缺乏计算机科学背景,我不知道。

    对我来说,第二组代码更容易阅读,看起来也不那么混乱。正如其他人提到的,tolist()有点不幸,但我还是觉得它更好。

    我更喜欢Daniel Br_¼Ckner的解决方案。这似乎比其他任何一种提议的解决方案都要好。