【问题标题】:Change foreach to lambda将 foreach 更改为 lambda
【发布时间】:2011-03-18 21:13:11
【问题描述】:

我需要帮助来简化此语句。如何将 foreach 更改为 lambda

var r = mp.Call(c => c.GetDataset());   // returns IEnumerable of dataset      
foreach (DatasetUserAppsUsage item in r)
{
   datasetUserAppsUsage.Merge(item.AppsUsageSummary);
}

【问题讨论】:

  • 你能把你的代码包装在一个代码块中吗?该符号看起来像{ }

标签: c# lambda foreach


【解决方案1】:

lambdas 和循环是正交的。尝试将它们更改为将它们强行更改为另一个是不合适的。那个代码很好。放下吧。

可以获得.ForEach 实现,但这不会使代码变得更好(事实上,它会更难遵循,即更糟),而且不会更高效(事实上,它会稍微慢一些,即更糟)。

【讨论】:

  • A foreach vs. List<T>.ForEach 总是让我想起下面的文章——diditwith.net/2006/10/05/PerformanceOfForeachVsListForEach.aspx
  • @JaredPar 非常有趣的文章。我很惊讶。
  • @JaredPar 是的,但是首先调用 .ToList() 只是为了使用 ForEach() 会有点抨击:)
  • 当然是的,这是一个问题:)。并不是要暗示这是针对这种特定情况的更好解决方案。只是这种辩论总是让我想起那篇文章,因为它得出的结论对我来说非常违反直觉。稍微考虑一下实现细节时会更有意义。
【解决方案2】:

您可以执行以下操作

r.ToList().ForEach(item => datasetUserAppsUsage.Merge(item.AppsUsageSummary);

【讨论】:

  • Marc Gravell 1 - JaredPar 0.5 ;-)
【解决方案3】:

就个人而言,我认为我不会将其合并到一个 lambda 中。你可以这样做:

mp.Call(c => c.GetDataset()).ToList().ForEach(item =>  datasetUserAppsUsage.Merge(item.AppsUsageSummary)); 

但是,我会避免它,因为它是purposefully causing side effects,它确实违反了 LINQ 的期望,并且其意图不是很清楚。

【讨论】:

    【解决方案4】:

    我同意 lambda 的用途不同,但有时我会使用这个技巧:

    mp.Call(c => c.GetDataset())
      .All(a => { datasetUserAppsUsage.Merge(a.AppsUsageSummary); return true; });
    

    诀窍是使用 All() 并返回 true 以避免中断。 当然,在枚举器内部时不要更改基础集合:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2016-12-01
      • 2018-11-05
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多