Заменить цикл foreach на linq
Я попытался заменить код
foreach (var discovery in mpwrapper.parser.Discoveries)
{
solution.AddFile("Discoveries", discovery.DisplayStringName + ".mpx", discovery);
}
со следующим выражением linq
mpwrapper.parser.Discoveries.Select(
s => solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s));
но есть ошибки
аргументы типа для способ - Система.В LINQ.Перечислимый.выбранная система.Коллекции.Родовой.интерфейс IEnumerable, Система.Функ)' не может быть выведено из использования. Пытаться явное указание аргументов типа.
Как преобразовать этот цикл foreach в запрос linq, где я выполняю метод для каждого объекта в моем Коллекцию IEnumerable?
7 ответов
Я думаю, что вам нужен метод ForEach;)
mpwrapper.parser.Discoveries.ToList().ForEach(s => { solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s); });
проблема в том, что Select должен возвращать значение, но и Linq не предназначен для мутирования коллекций. Подумайте о select как о преобразовании коллекции, а не об изменении состояния для каждого элемента
возможно, цикл foreach является лучшим решением здесь
LINQ означает интегрированный запрос языка... но на самом деле это не так!--6-->запрос ничего.
если mpwrapper.parser.Discoveries
Это List<T>
можно использовать ForEach
способ; или, если это IEnumerable
, вы всегда можете добавить ForEach
метод расширения... но это скорее незначительные эстетические изменения и не имеет ничего общего с LINQ.
Я использую небольшой обман с .Все методы. Он просто требует возвращаемого логического значения и представляет очень аккуратно. Я включил образец с встроенным linq внутри .Все!--2-->
configurations.All(c =>
{
var gcx = globalConfigurations.FirstOrDefault(gc =>
gc.Type == c.Type && configurationGuids.Any(cGuid => gc.Guid == cGuid)
);
return true;
});
Если открытия-это список, то сделайте это так
mpwrapper.parser.Discoveries.ForEach(discovery => solution.AddFile("Discoveries", discovery .DisplayStringName + ".mpx", discovery);
если нет, преобразуйте его в List first :)
попробуйте это:
mpwrapper.parser.Discoveries.ToList()
.ForEach(s =>
solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s));