【问题标题】:Refactor foreach loop to List<T>.ForEach(...)将 foreach 循环重构为 List<T>.ForEach(...)
【发布时间】:2016-08-27 06:19:24
【问题描述】:

给定:

foreach (var obj in _data)
{
    maxRows++;
    foreach (var param in obj.Parameters)
        maxRows++;
}

我正在尝试将其转换为(最好)单个语句。不是特别出于任何原因,只是好奇它是否足够容易在心理上解析,如果可能的话。

_data.ForEach(feObj => maxRows++);
_data.ForEach(feObj => feObj.Parameters.ForEach(feParam => maxRows++));

这似乎完成了同样的事情,尽管它似乎比原来的效率要低,因为要多迭代一次 _data。

有没有办法将两行中的两个动作组合成一个语句?

【问题讨论】:

  • ForEach 不是 Linq。但你可以做_data.ForEach(obj =&gt; {maxRows++; obj.Parameters.ForEach(param =&gt; maxRows++);});
  • @Kritner,LINQ 只是一个有用的扩展库,例如SelectWhereFirstAny,它们可以针对任何IEnumerable&lt;T&gt; 运行。在List&lt;T&gt;有一个 扩展ForEach,但它不在LINQ 库中,所以它不是真正的LINQ 扩展。 LINQ 中的Q 代表查询,这是库提供的。 ForEach 通常不是查询,而是对集合中的每个项目执行的操作。这就是为什么它不在基础 LINQ 库中。
  • @Kritner 我猜你可以称它为函数式方法?就我个人而言,我认为这是可憎的,因为它真的不比普通的foreach 好。您可以阅读this 以了解为什么没有“Linq”ForEach
  • @Jonesopolis ForEach 不是List&lt;T&gt; 的扩展方法。这只是一个普通的类方法。
  • @Jonesopolis 我完全相信你。

标签: c# list foreach


【解决方案1】:

你可以只取总和:

maxRows += _data.Sum(obj => 1 + obj.Parameters.Count())

【讨论】:

    【解决方案2】:

    您可以在同一个循环中执行此操作。

    _data.ForEach(feObj => 
     {
        maxRows++;
        feObj.Parameters.ForEach(feParam => maxRows++);
     });
    

    此外,如果您只是添加计数,您应该按照@Rob 的回答进行操作。如果有任何其他逻辑,您可以将其放在大括号内。

    【讨论】:

    • 谢谢,计数是一个例子,如果这是我的最终目标,Rob 会起作用。你的语法(我最初猜想)@Juharr's 是我真正想要的。猜猜这与我原来的嵌套 foreach 循环看起来并没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2017-07-14
    • 2010-12-27
    • 1970-01-01
    • 2010-10-24
    • 2010-10-19
    • 2013-04-04
    相关资源
    最近更新 更多