用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集合中的每个对象执行一个方法?
我认为您需要的是ForEach方法;)
mpwrapper.parser.Discoveries.ToList().ForEach(s => { solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s); });
问题是Select需要返回一个值,但Linq并不是为了突变集合而设计的。将选择视为对集合的转换,而不是每个项目的状态更改
也许foreach循环是这里的最佳解决方案
如果mpwrapper.parser.Discoveries
是List<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:)