用linq替换foreach循环

时间:2013-07-10 13:42:33

标签: c# 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));

但是出错了

  

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

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

7 个答案:

答案 0 :(得分:14)

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

mpwrapper.parser.Discoveries.ToList().ForEach(s => { solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s); });

答案 1 :(得分:6)

问题是Select需要返回一个值,而Linq也不是为了改变集合而设计的。将select视为对集合的转换,而不是每个项目的状态更改

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

答案 2 :(得分:4)

LINQ代表语言集成查询......但你实际上并没有查询任何内容。

如果mpwrapper.parser.DiscoveriesList<T>,您可以使用ForEach方法;或者,如果它是IEnumerable,您可以随时添加ForEach扩展方法......但这不仅仅是一种微小的美学变化,与LINQ无关。

答案 3 :(得分:1)

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

但是,IEnumerable<T>上不存在此方法。

答案 4 :(得分:1)

我对.All方法使用了一点作弊。它只需要一个返回布尔值并且非常整齐地呈现。我在.All

中包含了嵌入linq的样本
configurations.All(c =>
{
    var gcx = globalConfigurations.FirstOrDefault(gc =>
        gc.Type == c.Type && configurationGuids.Any(cGuid => gc.Guid == cGuid)
    );
    return true;
});

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

试试这个:

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