C# 如何使用linq轻松删除多个进程

C# 如何使用linq轻松删除多个进程,c#,linq,C#,Linq,我有两个进程:notepad和taskmgr open。我想杀死这两个或几个进程我怎么能做到这一点? 到目前为止,我通过谷歌搜索得出了以下结论: Process.GetProcesses().Where(p => p.ProcessName == "notepad,taskmgr").ToList().ForEach(y => y.Kill()); 不确定如何区分上述两个进程?创建一个包含要终止的进程的列表或数组,然后检查列表中的进程名称 List<string> ki

我有两个进程:notepad和taskmgr open。我想杀死这两个或几个进程我怎么能做到这一点? 到目前为止,我通过谷歌搜索得出了以下结论:

Process.GetProcesses().Where(p => p.ProcessName == "notepad,taskmgr").ToList().ForEach(y => y.Kill());

不确定如何区分上述两个进程?

创建一个包含要终止的进程的列表或数组,然后检查列表中的进程名称

List<string> killme = new List<string> { "notepad", "taskmgr" }

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

你想这么做吗

Process.GetProcesses().Where(p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr")
    .ToList().ForEach(y => y.Kill());
如果我是你,我会做的就是一次只做一个名字。阅读代码的人更容易理解

class Program
{
    static void Main(string[] args)
    {
        killProcess("notepad.exe");
        killProcess("taskmgr");
    }

    public static void killProcess(string name)
    {
        foreach (Process process in Process.GetProcessesByName(name))
        {
            process.Kill();
        }
    }
}

当linq查询的名称为记事本taskmgr时,它看起来只是在查找一个进程。要同时获取这两种信息,请使用如下查询:

Process.GetProcesses().Where(p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr").ToList().ForEach(y => y.Kill());
var processNamesToKill = new List<string> { "notepad", "taskmgr", "someotherprocess" };
Process.GetProcesses().Where(p => processNamesToKill.Contains(p.ProcessName)).ToList().ForEach(y => y.Kill());
如果要添加更多进程,可能需要执行以下操作:

Process.GetProcesses().Where(p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr").ToList().ForEach(y => y.Kill());
var processNamesToKill = new List<string> { "notepad", "taskmgr", "someotherprocess" };
Process.GetProcesses().Where(p => processNamesToKill.Contains(p.ProcessName)).ToList().ForEach(y => y.Kill());
然后可以将其他进程添加到该列表中。至于找出您在ForEach中找到的名称,您可以通过y.ProcessName访问该名称,并在需要时在条件中使用它


编辑:如果需要,将.exe添加到那些进程名称中。

如果linq的其余部分工作正常,那么应该是

... Where( p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr" ) ...
var processesToKill = new Collection<string> { "notepad", "taskmgr" };

foreach (var process in Process.GetProcesses().Where(p => processesToKill.Contains(p)))
{
    process.Kill();
}
否则,您可能需要创建一组要终止的进程名称,如

var set = new HashSet<string>() { "notepad.exe", "taskmgr.txt", "someotherthing.exe" };
... linq .. Where( p=> set.Contains( p.ProcessName ) )...

或集合上的其他各种联接操作。

如果有要终止的进程列表,可以使用Contains,就像p=>p.ProcessName==notepad,taskmgr不起作用没有进程的名称notepad,taskmgr,添加逗号没有特殊意义

        var processesToKill = new [] {"notepad", "iexplorer"};
        var processes = Process.GetProcesses().Where(p => processesToKill.Contains(p.ProcessName)).ToList();
        processes.ForEach(p => p.Kill());
因此,你可以试试类似的方法

... Where( p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr" ) ...
var processesToKill = new Collection<string> { "notepad", "taskmgr" };

foreach (var process in Process.GetProcesses().Where(p => processesToKill.Contains(p)))
{
    process.Kill();
}

这是最好的方法吗?有一种单线解决方案吗?我猜不对?我建议用一组字符串代替列表,但那只是me@NoviceMe有人发布了LINQ语句中一个数组的一行解决方案,但我认为这是一个更大的解决方案。readable@NoviceMe更新为一行,虽然我更喜欢第一个答案,但我认为KillAllProcessEsEnumerable processesToKill方法对消费者来说是可读的。@Servy这是另一种接口方式。虽然我仍然不会把它全部放在linq命令中,我会使用,但是使用Where作为其他命令并不是一个糟糕的主意。