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

时间:2016-04-29 04:31:01

标签: c# linq lambda

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

3 个答案:

答案 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() );