2

我必须编写代码以获取所有可访问的进程,但我需要删除此数组上的重复项,并且每个进程只显示一次。

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

我的代码:

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

提前致谢

4

1 回答 1

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

您可能必须根据您的规格和您将要使用它的情况来改进比较器。

于 2013-04-24T21:36:34.203 回答