您如何/可以将其重写为Linq?

时间:2010-11-27 15:09:31

标签: c# linq

我正在这样做,我只是想知道,如果Linq可以用来重写这个,我对这一切都是新手吗?

private void checkacrobat()
{
    Process[] prs = Process.GetProcesses();
    foreach(Process pr in prs)
    {
         if(pr.ProcessName == "****ProcessName")
              pr.Kill();
    }
}

6 个答案:

答案 0 :(得分:7)

foreach(var process in Process.GetProcesses().Where(p=>p.ProcessName==whatever))
    process.Kill();

请记住,将语句用于操作,例如终止进程。使用LINQ进行查询,读取值而不更改它们。

但是你的代码完全可读。没有充分的理由我不会改变它。

答案 1 :(得分:5)

方法语法:

var processesToBeKilled = Process.GetProcesses()
                                 .Where(pr => pr.ProcessName == "****ProcessName");

foreach(var process in processesToBeKilled)
   process.Kill();

在查询语法中:

var processesToBeKilled = from pr in Process.GetProcesses()
                          where pr.ProcessName == "****ProcessName"
                          select pr;

foreach(var process in processesToBeKilled)
   process.Kill();

专用方法:

这里真的不需要LINQ;已经有了方便的Process.GetProcessesByName方法:

var processesToBeKilled = Process.GetProcessesByName("****ProcessName");

foreach(var process in processesToBeKilled)
   process.Kill();

答案 2 :(得分:2)

请注意,LINQ用于查询,投影和聚合。你正在做一些有副作用的事情,而LINQ并不适合。因此,我将查询部分与副作用部分分开。

private void KillProcessesWithName(string processName) {
    var processesToKill = Process.GetProcesses()
                                 .Where(p => p.ProcessName == processName);
    foreach(var process in processesToKill) {
        process.Kill();
    }
}

LINQified版本是否更好是有争议的,我会保持原样。

答案 3 :(得分:1)

IEnumerable没有ForEach扩展方法,因此您无法将其完全重写为LINQ(除非您使用自己的ForEach扩展)

Process[] processes in Process.GetProcesses();
foreach(Process pr in processes.Where(p => p.ProcessName == "****ProcessName"))
{
pr.Kill();
}

答案 4 :(得分:1)

var processes = from process in Process.GetProceeses()
where process.ProcessName == "****ProcessName"
select process;

foreach(var p in processes){
    p.Kill()
}

答案 5 :(得分:1)

我认为List有一个你可以使用的ForEach扩展。

Process.GetProcesses().Where(p=>p.ProcessName==whatever).ToList().ForEach(y => y.Kill);