userbb
userbb

Reputation: 1874

Change foreach to lambda

I need a help with simpify this statement. How to change foreach to lambda

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

Upvotes: 4

Views: 23280

Answers (4)

Thom Smith
Thom Smith

Reputation: 1

I agree that lambdas purpose it different, but sometimes I use this trick:

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

The trick is to use All() and return true to avoid break. And do not change the underlying collection when inside enumerator of course :)

Upvotes: 0

Reed Copsey
Reed Copsey

Reputation: 564333

Personally, I don't think I would merge this into a single lambda. You could do:

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

However, I would avoid it, as it's purposefully causing side effects, which really violates the expectations of LINQ, and is not very clear in its intent.

Upvotes: 5

JaredPar
JaredPar

Reputation: 754545

You can do the following

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

Upvotes: 12

Marc Gravell
Marc Gravell

Reputation: 1062520

lambdas and loops are orthogonal. It is inappropriate to try to change them to brute-force one into the other. That code is fine. Leave it.

You can get .ForEach implementations, but it isn't going to make the code better (in fact, it will be harder to follow, i.e. worse), and it won't be more efficient (in fact, it will be marginally slower, i.e. worse).

Upvotes: 15

Related Questions