Заменить цикл 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));

на List<T>.ForEach метод делает трюк.

однако, этот метод не существует на IEnumerable<T>.