Поменяйте foreach на лямбду - PullRequest
3 голосов
/ 19 марта 2011

Мне нужна помощь с упрощением этого утверждения.Как изменить foreach на лямбда

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

Ответы [ 4 ]

13 голосов
/ 19 марта 2011

лямбды и петли ортогональны. Неуместно пытаться изменить их, чтобы грубо насиловать друг друга. Этот код в порядке. Оставь это.

Вы можете получить .ForEach реализаций, но это не улучшит код (на самом деле, будет сложнее следовать, то есть хуже), и больше не будет эффективный (фактически он будет немного медленнее, т.е. хуже).

10 голосов
/ 19 марта 2011

Вы можете сделать следующее

r.ToList().ForEach(item => datasetUserAppsUsage.Merge(item.AppsUsageSummary);
5 голосов
/ 19 марта 2011

Лично я не думаю, что я бы слил это в одну лямбду. Вы могли бы сделать:

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

Однако я бы этого избегал, поскольку он целенаправленно вызывает побочные эффекты , что действительно противоречит ожиданиям LINQ и не очень ясно в его намерениях.

0 голосов
/ 20 мая 2015

Я согласен с тем, что лямбды имеют разные цели, но иногда я использую этот трюк:

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

Хитрость в том, чтобы использовать All () и возвращать true , чтобы избежать разрыва. И не меняйте основную коллекцию, когда внутри перечислителя, конечно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...