我只想知道如何在lambda表达式或linq中编写以下代码。如果你知道,请回答。
Process[] runingProcess = Process.GetProcesses();
ManagementObjectCollection moReturn;
ManagementObjectSearcher moSearch;
void func()
{
moSearch = new ManagementObjectSearcher("Select * from Win32_Product");
moReturn = moSearch.Get();
foreach (ManagementObject mo in moReturn)
{
foreach (var process in Process.GetProcessesByName(mo["Name"].ToString()))
{
process.Kill();
}
}
}
答案 0 :(得分:3)
与其他答案不同,我认为使用.ToList()
和.ForEach(...)
与LINQ相反。一旦使用这些关键字,LINQ查询就会结束。特别是.ForEach()
,因为.ForEach(...)
的目的是cause a side-effect,而LINQ是用于查询。
我的版本是:
// Query for processes to kill
var data = new ManagementObjectSearcher("Select * from Win32_Product")
.Get()
.Cast<ManagementObject>()
.SelectMany(mo => Process.GetProcessesByName(mo["Name"].ToString()));
// Kill the processes
foreach (var item in data) {
item.Kill();
}
答案 1 :(得分:1)
这是迭代部分的LINQ等价物:
moReturn.Cast<ManagementBaseObject>().ToList().ForEach(mo => Process.GetProcessesByName(mo["Name"].ToString()).ToList().ForEach(proc => proc.Kill()));
编辑:这个答案在语义上等同于OP问题中的迭代,但它没有获得任何东西。通过使用SelectMany
展平Processes
代替ForEach
,查看更合适的其他热门答案。
答案 2 :(得分:1)
使用 SelectMany 来展平流程。
var moSearch = new ManagementObjectSearcher("Select * from Win32_Product");
var moReturn = moSearch.Get();
var processes = moReturn.Cast<ManagementObject>()
.SelectMany (mo => Process.GetProcessesByName(mo["Name"].ToString()))
.ToList();
processes.ForEach(p=> p.Kill() );
或在查询语法
中 var moSearch = new ManagementObjectSearcher("Select * from Win32_Product");
var moReturn = moSearch.Get();
var processes = (from mo in moReturn.Cast<ManagementObject>()
from prc in Process.GetProcessesByName(mo["Name"].ToString())
select prc).ToList();
processes.ForEach(p=> p.Kill() );