C# 有没有办法简化比较流程列表?
我只是好奇是否有一种简单的方法来编写这段代码,或者更高效 我想等待新的notepad.exe存在,将该进程添加到进程列表或进程ID列表中(仅当该进程不在列表中时),并删除该列表中不再存在的任何进程。然后以无休止的循环重复C# 有没有办法简化比较流程列表?,c#,list,process,C#,List,Process,我只是好奇是否有一种简单的方法来编写这段代码,或者更高效 我想等待新的notepad.exe存在,将该进程添加到进程列表或进程ID列表中(仅当该进程不在列表中时),并删除该列表中不再存在的任何进程。然后以无休止的循环重复 public static List<int> Clients = new List<int>(); while(true) { foreach (int r in Clients) if (!ProcessExists(r))
public static List<int> Clients = new List<int>();
while(true)
{
foreach (int r in Clients)
if (!ProcessExists(r))
{
Clients.Remove(r);
Console.WriteLine(r + " was removed.");
break;
}
bool check = false;
Process[] initial = Process.GetProcessesByName("notepad");
foreach (Process i in initial)
{
foreach(int r in Clients)
{
if (i.Id == r)
{
check = true;
}
}
if (check == false)
{
Clients.Add(i.Id);
Console.WriteLine(i.Id + " was added.");
}
check = false;
}
Thread.Sleep(250);
}
private static bool ProcessExists(int id)
{
return Process.GetProcessesByName("notepad").Any(x => x.Id == id);
}
处理删除的第一个循环可以使用Linq更简单:
Clients.RemoveAll(p => !ProcessExists(p));
或者通过这种方式保存日志:
Clients.RemoveAll(p => {
if (!ProcessExists(p)) {
Console.WriteLine(p + " was removed.");
return true;
}
return false;
});
对于第二个循环,可以使用List类的Contains方法:
Clients变量是在方法之外声明的,为了清晰起见,我只在while循环上方显示它。是的,这是实际代码,它正在工作,因为我在之后中断,以避免抛出异常,该异常表示列表可能已被修改。啊。。。别理我,我没读过那篇文章;可以使用哈希集而不是列表来避免重复。因此,您的最后一个foreach可以简化为一行代码:如果添加了Clients.Addi.Id Console.WriteLinei.Id+。;作为hashset,add不会添加重复项,它会告诉您是否有重复项。谢谢,这正是我要找的。
Process[] initial = Process.GetProcessesByName("notepad");
foreach (Process i in initial)
{
if (!Clients.Contains(i.Id))
{
Clients.Add(i.Id);
Console.WriteLine(i.Id + " was added.");
}
}