[英]How to write following code in lambda expression or linq?
I just want to know that how to write following code in lambda expression or linq. 我只想知道如何在lambda表达式或linq中编写以下代码。 Please answer if you know. 如果您知道,请回答。
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();
}
}
}
Unlike the other answers, I consider using .ToList()
and .ForEach(...)
to be the opposite of LINQ. 与其他答案不同,我认为使用.ToList()
和.ToList()
.ForEach(...)
与LINQ相反。 Once you use those keywords, your LINQ query ends. 一旦使用了这些关键字,LINQ查询就会结束。 Especially .ForEach()
, since the purpose of .ForEach(...)
is to cause a side-effect , and LINQ is for querying. 特别是.ForEach()
,因为.ForEach(...)
的目的是产生副作用 ,而LINQ用于查询。
My version would be: 我的版本是:
// 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();
}
This is LINQ equivalent for iterating part: 这是LINQ等效的迭代部分:
moReturn.Cast<ManagementBaseObject>().ToList().ForEach(mo => Process.GetProcessesByName(mo["Name"].ToString()).ToList().ForEach(proc => proc.Kill()));
Edit : This answer is semantically equivalent to the iteration in the OP question, but it doesn't gain anything. 编辑:此答案在语义上等价于OP问题中的迭代,但没有任何收益。 See other upvoted answers which is more proper by using SelectMany
to flatten the Processes
instead of ForEach
. 通过使用SelectMany
而不是ForEach
来使Processes
扁平化,可以查看其他更恰当的答案。
Use SelectMany to flatten processes. 使用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() );
or in Query syntax 或以查询语法
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() );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.