2013-04-24 91 views
2

我必须编写代码才能获得所有可访问的进程,但是我需要删除此数组上的重复项,并且每个进程只显示一次。使用VB去除进程数组中的重复项.net

如何做到这一点的最佳方法,因为我认为进程数组不像普通数组。

我的代码:

For Each p As Process In Process.GetProcesses 
    Try 
     'MsgBox(p.ProcessName + " " + p.StartTime.ToString) 
    Catch ex As Exception 
     'Do nothing 
    End Try 
Next 

预先感谢

+0

为什么你认为它不是一个正常的数组? “类型为Process的**数组**,代表在本地计算机上运行的所有进程资源。” [Process.GetProcesses方法](http://msdn.microsoft.com/en-us/library/1f3ys1f9.aspx) – Tim 2013-04-24 21:20:22

回答

4

Process.GetProcesses()方法返回一个数组。您可以使用Distinct方法,为其提供IEqualityComparer

一个例子是作为比较器:

Public Class ProcessComparer 
    Implements IEqualityComparer(Of Process) 

    Public Function Equals1(p1 As Process, p2 As Process) As Boolean Implements IEqualityComparer(Of Process).Equals 
     ' Check whether the compared objects reference the same data. 
     If p1 Is p2 Then Return True 
     'Check whether any of the compared objects is null. 
     If p1 Is Nothing OrElse p2 Is Nothing Then Return False 
     ' Check whether the Process' names are equal. 
     Return (p1.ProcessName = p2.ProcessName) 
    End Function 

    Public Function GetHashCode1(process As Process) As Integer Implements IEqualityComparer(Of Process).GetHashCode 
     ' Check whether the object is null. 
     If process Is Nothing Then Return 0 
     ' Get hash code for the Name field if it is not null. 
     Return process.ProcessName.GetHashCode() 
    End Function 
End Class 

而且你可以使用它像这样:

Sub Main() 
    Dim processes As Process() = Process.GetProcesses() 
    Console.WriteLine(String.Format("Count before Distinct = {0}", processes.Length)) 

    ' Should contain less items 
    Dim disProcesses As Process() = processes.Distinct(New ProcessComparer()).ToArray() 
    Console.WriteLine(String.Format("Count after Distinct = {0}", disProcesses.Length)) 

    Console.ReadLine() 
End Sub 

你很可能得比较程序细化到您的规格和你的情况会使用它。

+0

完美!谢谢! – jgiunta 2013-04-24 22:05:36