Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法简化比较流程列表?_C#_List_Process - Fatal编程技术网

C# 有没有办法简化比较流程列表?

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))

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

我想等待新的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);    
}

处理删除的第一个循环可以使用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.");
        }
    }