C# 如何在lambda表达式或linq中编写以下代码?

C# 如何在lambda表达式或linq中编写以下代码?,c#,linq,lambda,C#,Linq,Lambda,我只是想知道如何用lambda表达式或linq编写以下代码。如果你知道,请回答 Process[] runingProcess = Process.GetProcesses(); ManagementObjectCollection moReturn; ManagementObjectSearcher moSearch; void func() {

我只是想知道如何用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();
        }
    }
}

这是迭代零件的LINQ等价物:

moReturn.Cast<ManagementBaseObject>().ToList().ForEach(mo => Process.GetProcessesByName(mo["Name"].ToString()).ToList().ForEach(proc => proc.Kill()));
moReturn.Cast().ToList().ForEach(mo=>Process.getProcessByName(mo[“Name”].ToString()).ToList().ForEach(proc=>proc.Kill());

编辑:这个答案在语义上等同于OP问题中的迭代,但它没有得到任何东西。通过使用
SelectMany
而不是
ForEach
,将
过程展平,查看其他更合适的上浮答案。这是LINQ等价于迭代部分:

moReturn.Cast<ManagementBaseObject>().ToList().ForEach(mo => Process.GetProcessesByName(mo["Name"].ToString()).ToList().ForEach(proc => proc.Kill()));
moReturn.Cast().ToList().ForEach(mo=>Process.getProcessByName(mo[“Name”].ToString()).ToList().ForEach(proc=>proc.Kill());

编辑:这个答案在语义上等同于OP问题中的迭代,但它没有得到任何东西。使用
SelectMany
扁平化
进程
而不是
ForEach

使用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=新的ManagementObjectSearcher(“从Win32_产品中选择*);
var moReturn=moSearch.Get();
var processs=moReturn.Cast()
.SelectMany(mo=>Process.getProcessByName(mo[“Name”].ToString())
.ToList();
processs.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() );
var moSearch=新的ManagementObjectSearcher(“从Win32_产品中选择*);
var moReturn=moSearch.Get();
var进程=(来自moReturn.Cast()中的mo)
来自prc in Process.GetProcessByName(mo[“Name”].ToString())
选择prc).ToList();
processs.ForEach(p=>p.Kill());

使用选择多个来展平流程

    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=新的ManagementObjectSearcher(“从Win32_产品中选择*);
var moReturn=moSearch.Get();
var processs=moReturn.Cast()
.SelectMany(mo=>Process.getProcessByName(mo[“Name”].ToString())
.ToList();
processs.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() );
var moSearch=新的ManagementObjectSearcher(“从Win32_产品中选择*);
var moReturn=moSearch.Get();
var进程=(来自moReturn.Cast()中的mo)
来自prc in Process.GetProcessByName(mo[“Name”].ToString())
选择prc).ToList();
processs.ForEach(p=>p.Kill());

< /代码> 不同于其他答案,我考虑使用<代码>。使用这些关键字后,LINQ查询将结束。尤其是
.ForEach()
,因为
.ForEach(…)
的目的是为了,而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();
}
//查询要终止的进程
var数据=新的ManagementObjectSearcher(“从Win32_产品中选择*)
.Get()
.Cast()
.SelectMany(mo=>Process.getProcessByName(mo[“Name”].ToString());
//终止进程
foreach(数据中的var项){
item.Kill();
}

< /代码> 不同于其他答案,我考虑使用<代码>。一旦使用这些关键字,LINQ查询就结束了。尤其是
.ForEach()
,因为
.ForEach(…)
的目的是为了,而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();
}
//查询要终止的进程
var数据=新的ManagementObjectSearcher(“从Win32_产品中选择*)
.Get()
.Cast()
.SelectMany(mo=>Process.getProcessByName(mo[“Name”].ToString());
//终止进程
foreach(数据中的var项){
item.Kill();
}

您在同一台计算机上尝试过的任何代码片段?是fujiFX.var pro=Process.getProcesss()。其中(i=>(i.ProcessName!=“lmc”);foreach(var prc in pro){prc.Kill();}您是否有调用
func
的代码示例?lambda express只需删除函数名并将其转换为匿名函数。因此,您可以调用
myobj.Method(func);
而不是调用
myobj.Method(()=>{/*此处的函数体…*/})
我只希望这样@fujiFX。这只是一个友好的提示,您可能想阅读本页:这样您就可以始终确保您的问题易于回答,并且尽可能清楚。请确保包括您为解决问题所做的任何努力,以及在尝试这些修复时发生的情况。另外,不要忘记您的建议w代码和任何错误消息!是否有您在同一程序上尝试过的代码片段?是fujiFX.var pro=Process.getProcesss()。其中(i=>(i.ProcessName!=“lmc”);foreach(var prc in pro){prc.Kill();}您是否有调用
func
的代码示例?lambda express只需删除函数名并将其转换为匿名函数。因此,您可以调用
myobj.Method(func);
而不是调用
myobj.Method(()=>{/*此处的函数体…*/})
我只希望这样@fujiFX。这只是一个友好的提示,您可能想阅读本页:这样您就可以始终确保您的问题易于回答,并且尽可能清楚。请确保包括您为解决问题所做的任何努力,以及在尝试这些修复时发生的情况。另外,不要忘记您的建议w代码和任何错误消息!谢谢@hendry,但它显示的错误(如managemant对象集合)不包含Tolist@chinnathambir我的错,应该先投。请看编辑后的答案。它可能看起来像LINQ,闻起来像LINQ,但使用
.ToList().ForEach()<