将foreach改为lambda

时间:2011-03-18 21:13:12

标签: c# lambda foreach

我需要一个帮助来简化这个陈述。如何将foreach更改为lambda

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

4 个答案:

答案 0 :(得分:13)

lambdas和loop是正交的。试图将它们变成另一个强暴的一个是不合适的。那段代码很好。离开吧。

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

答案 1 :(得分:10)

您可以执行以下操作

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:0)

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

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

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