简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM