13

我试图替换代码

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));

但是遇到了错误

无法从用法中推断方法“System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)”的类型参数。尝试明确指定类型参数。

如何将此 foreach 循环转换为 linq 查询,在其中对 IEnumerable 集合中的每个对象执行方法?

4

7 回答 7

18

我认为您需要的是 ForEach 方法;)

mpwrapper.parser.Discoveries.ToList().ForEach(s => { solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s); });
于 2013-07-10T13:45:06.463 回答
6

问题是 Select 需要返回一个值,而且 Linq 并非旨在改变集合。将 select 视为对集合的转换,而不是每个项目的状态更改

也许 foreach 循环是这里最好的解决方案

于 2013-07-10T13:45:03.067 回答
4

LINQ 代表 Language INtegrated Query……但您实际上并没有查询任何内容。

如果mpwrapper.parser.Discoveries是 a List<T>,则可以使用该ForEach方法;或者,如果它是一个IEnumerable,你总是可以添加一个ForEach扩展方法......但这更多的是一个小的审美变化,与 LINQ 无关。

于 2013-07-10T13:48:41.600 回答
2

我对 .All 方法使用了一个小技巧。它只需要一个返回布尔值并且非常整齐地呈现。我在 .All 中包含了一个带有嵌入式 linq 的示例

configurations.All(c =>
{
    var gcx = globalConfigurations.FirstOrDefault(gc =>
        gc.Type == c.Type && configurationGuids.Any(cGuid => gc.Guid == cGuid)
    );
    return true;
});
于 2017-07-22T13:45:39.580 回答
1

List<T>.ForEach方法可以解决问题。

但是,这种方法在IEnumerable<T>.

于 2013-07-10T13:47:54.843 回答
1

尝试这个:

mpwrapper.parser.Discoveries.ToList()
    .ForEach(s =>
        solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s));
于 2013-07-10T13:48:18.987 回答
0

如果 Discoveries 是一个列表,那么就这样做

mpwrapper.parser.Discoveries.ForEach(discovery => solution.AddFile("Discoveries", discovery .DisplayStringName + ".mpx", discovery);

如果没有,请先将其转换为 List :)

于 2013-07-10T13:46:30.410 回答