2011-03-18 63 views
2

我需要simpify这个语句的帮助。如何将foreach更改为lambda变化的foreach以拉姆达

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

你能不能请你包裹在代码代码块的枚举?符号看起来像'{}' – 2011-03-18 21:14:13

回答

12

lambda表达式和循环是正交的。试图将它们变成另一个强力型是不合适的。该代码很好。别管它。

可以得到.ForEach实现,但它不会使代码更好的(事实上,这将是难以遵循,即更差),也不会更有效(其实,它会稍微慢一点,即更糟糕)。

+3

一个foreach对'名单 .ForEach'总让我想起了下面的文章的 - http://diditwith.net/2006/10/05/PerformanceOfForeachVsListForEach.aspx – JaredPar 2011-03-18 22:16:33

+0

@JaredPar很有趣的文章。我很惊讶。 – 2011-03-18 22:44:11

+0

@JaredPar是的,但调用.ToList()最初只是使用的ForEach()将大满贯多少有些:) – 2011-03-19 08:06:21

9

你可以做以下

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

Marc Gravell 1 - JaredPar 0.5 ;-) – 2011-03-18 21:16:46

5

就个人而言,我不认为我会合并成一个单一的λ这一点。你可以这样做:

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

不过,我会避开它,因为它是purposefully causing side effects,这确实违反了LINQ的期望,而不是它的意图非常明确。

0

我同意lambda表达式的目的是不同的,但有时我用这一招:

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

的技巧是使用所有(),并返回真正,以避免分裂。 不改底层集合里面的时候当然:)