C# - 查找两个进程类型列表之间的差异

C# - Finding difference between two lists of Process type

我正在尝试比较两个进程列表并仅获取差异(新启动的进程)。 因此,当我在我的 winform 中单击一个按钮时,程序应该加载旧进程,然后加载新进程,在差异中比较它们并显示差异列表。第一次的 Difference 列表应该是空的,因为 oldProcesses 和 newProcesses 是相同的。 但这并没有发生,问题在于这段代码:var Difference = newProcesses.Except(oldProcesses).ToList(); 我怎样才能知道 newProcesses 和 oldProcesses 的区别? 谢谢

    Process[] oldProcesses = { };
    int clicked = 0;

    private void button1_Click_1(object sender, EventArgs e)
    {           
        if (clicked == 0)
        {
            oldProcesses = Process.GetProcesses();            
            clicked = 1;
        }
        Console.WriteLine("Old: " + oldProcesses.Count());

        Process[] newProcesses = Process.GetProcesses();
        Console.WriteLine("New: " + newProcesses.Count());

        var Difference = newProcesses.Except(oldProcesses).ToList();
        Console.WriteLine("Diff: " + Difference.Count());


        string allproc = "";
        foreach(Process theprocess in oldProcesses)
        {
            allproc += theprocess.ProcessName.ToString() +"\n";
        }
        MessageBox.Show(allproc);

        allproc = "";
        foreach (Process theprocess in newProcesses)
        {
            allproc += theprocess.ProcessName.ToString() + "\n";
        }
        MessageBox.Show(allproc);


        allproc = "";
        foreach (Process theprocess in Difference)
        {
            allproc += theprocess.ProcessName.ToString() + "\n";
        }
        MessageBox.Show(allproc);


        /*Process[] processlist = Process.GetProcesses();
        string ProcList = "";
        string temp;
        foreach (Process theprocess in processlist)
        {
            temp = theprocess.ProcessName.ToString() + "\n";
            ProcList += temp;
        }*/
    }
public class ProcessDiff : IEqualityComparer<Process>
{

    public IEnumerable<Process> GetDiff(IEnumerable<Process> oldProcesses, IEnumerable<Process> newProcesses )
    {
        return newProcesses.Except(oldProcesses, this);
    }
    public bool Equals(Process x, Process y)
    {
        if (x == null && y == null) return true;
        if (x == null || y == null) return false;
        return x.Id == y.Id && x.ProcessName == y.ProcessName && x.SessionId == y.SessionId;
    }

    public int GetHashCode(Process obj)
    {
        if (obj == null) return 0;
        return obj.Id;
    }
}

和用法:

        var oldProc = Process.GetProcesses();
        var newProc = Process.GetProcesses();

        var diff = new ProcessDiff().GetDiff(oldProc, newProc);

如果您不想,实际上不需要为此单独制作一个 class。您也可以只使表单实现 IEqualityComparer<Process> 并向其添加所需的 Equals() / GetHashCode() 方法。 Except 方法有一个包含比较方法的 class 实例的参数(this 如果它在包含 IEqualityComparer 方法的同一个 class 中被调用)。

更新: 我添加了一些额外的约束,因为 Process.Id 可以被回收。您可能需要根据此处的需求检查其他因素。请记住,Idle 进程会对某些属性抛出异常。