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
进程会对某些属性抛出异常。
我正在尝试比较两个进程列表并仅获取差异(新启动的进程)。 因此,当我在我的 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
进程会对某些属性抛出异常。