有什么方法可以简化比较进程列表?

问题描述 投票:0回答:1

如果有一种简化的方法来编写这段代码,或者更高效,我只是好奇。

我想等待一个新的notepad.exe存在,只有当它不在列表中时才将该进程添加到进程列表或进程ID列表中,同时删除该列表中不再存在的任何进程。然后在无限循环中重复。

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);    
}
c# list process
1个回答
1
投票

使用Linq可以更简单地处理删除的第一个循环:

Clients.RemoveAll(p => !ProcessExists(p));

或者这样,保持日志:

Clients.RemoveAll(p => {
    if (!ProcessExists(p)) {
        Console.WriteLine(p + " was removed.");
        return true;
    }
    return false;
});

对于第二个循环,您可以使用Contains()类的List<>方法:

    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.");
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.