我试图替换代码
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集合中的每个对象上执行一个方法?
答案 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.Discoveries
是List<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));