C# 用linq语句替换foreach
我正在尝试将此代码转换为linq:C# 用linq语句替换foreach,c#,linq,C#,Linq,我正在尝试将此代码转换为linq: foreach (var printer in printers) { if (printer.Installed) installedPrinters.Add(printer); } 我是Linq的新手,希望在遍历集合时能得到关于它如何工作的提示。因此,首先使用Where过滤已安装的==true,然后使用ForEach运行它们: printers.Where(p => p.Installed).ForEach(p =>
foreach (var printer in printers)
{
if (printer.Installed)
installedPrinters.Add(printer);
}
我是Linq的新手,希望在遍历集合时能得到关于它如何工作的提示。因此,首先使用
Where
过滤已安装的==true,然后使用ForEach运行它们:
printers.Where(p => p.Installed).ForEach(p => installedPrinters.Add(p));
请注意,需要在ForEach之前调用ToList()(请参阅)
还要注意的是,虽然这是可行的,但您的原始代码可能更容易阅读。。。LINQ很酷,但并不觉得有义务把它用于所有事情:)试试这个
printer.Where(x => x.Installed).ToList()
.ForEach(
p=>
{
installedPrinters.Add(p)
}
);
如果您只是尝试创建一个新列表,您可以始终执行以下操作:
var installedPrinters = printers.Where(p => p.Installed).ToList();
如果要添加到可能已包含项目的列表中,则可以尝试:
installedPrinters.AddRange(printers.Where(p => p.Installed));
假设您安装的打印机实际上是一个支持AddRange(如List)的集合。请注意,Robert的回答更准确,因为它包含了ToListI。我还提到c#编译器团队的主要开发人员之一(Eric Lippert)(我也不这么认为)。第一个原因是这样做违反了所有其他序列操作符所基于的函数编程原则。显然,调用此方法的唯一目的是造成副作用。表达式的目的是计算值,而不是产生副作用。语句的目的是产生副作用。更简单地说,printer=>installedPrinters.Add(打印机)
可以是已安装的打印机。添加@Ripple,您认为您的备选方案如何知道要在foreach中安装哪台打印机?@ErikPhilipsforeach
具有操作
的符号,该符号无效添加(打印机打印机)
满足。它只是以与lambada相同的方式传递参数。(我也同意你的第一句评论顺便说一句,他不应该使用ForEach
)@ErikPhilips每个打印机都会经过@Scott评论的ForEach
。此外,我假设installedPrinters.Add
返回void
。对不起,我的话不够多。
var installedPrinters = printers.Where(p => p.Installed).ToList();
installedPrinters.AddRange(printers.Where(p => p.Installed));