用linq替换foreach循环

本文关键字:循环 foreach 替换 linq | 更新日期: 2023-09-27 18:21:45

我试图替换代码

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集合中的每个对象执行一个方法?

用linq替换foreach循环

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

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

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

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

LINQ代表语言集成查询。。。然而,您实际上并没有查询任何内容。

如果mpwrapper.parser.DiscoveriesList<T>,则可以使用ForEach方法;或者,如果是IEnumerable,您可以添加ForEach扩展方法……但这只是一个较小的美学变化,与LINQ无关。

我在.All方法中使用了一个小欺骗。它只需要一个返回布尔值,并且呈现得非常整洁。我在里面包括了一个嵌入linq的样品。所有

configurations.All(c =>
{
    var gcx = globalConfigurations.FirstOrDefault(gc =>
        gc.Type == c.Type && configurationGuids.Any(cGuid => gc.Guid == cGuid)
    );
    return true;
});

试试这个:

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

List<T>.ForEach方法可以实现此功能。

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

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

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

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