根据对象值从列表中移除对象

时间:2019-10-13 03:03:20

标签: vb.net

如何根据值从列表中删除对象,出现索引超出范围错误

'A class called Person exists'
Dim PersonOne As New Person
PersonOne.name = "John"
PersonOne.age = 50

'Created a list to store them'
Dim MyList As New List(Of Person)
MyList.Add(PersonOne)

'Now to remove an object'
Dim ObjectToRemove As String = "John"

For Each item in MyList
    If String.Compare(item.name, ObjectToRemove) = 0 Then

        'How do I get the index to remove?'

    End If
Next

对不起,我把代码从脑海中摔了下来,我的原始代码有些混乱。但要点是,我只想比较一个值,如果匹配则将其删除。 List(Of)中的对象。

1 个答案:

答案 0 :(得分:2)

使用FindIndex方法,该方法接受谓词委托。您可以为谓词委托传递一个lambda函数。

(而且,我认为将String.Equals与显式StringComparison一起使用比使用String.Compare(x,y) == 0更为清晰,因为这样可以更好地表明意图)。

Dim personOneHasThisIndex As Integer
personOneHasThisIndex = MyList.FindIndex( Function(p) p.name.Equals( ObjectToRemove, StringComparison.Ordinal ) )

If personOneHasThisIndx > -1 Then
    ' Always check if the result is -1, which means it doesn't exist
    MyList.RemoveAt( personOneHasThisIndex )

End If

请注意,List<T>.RemoveAt(Int32 index)效率很低,因为它必须移动列表中的每个元素(列表不能有“空”空格)。如果您有一个概念性的清单,那么您将要添加和删除的清单很多,请考虑使用LinkedListHashSet(如果元素的顺序无关紧要)。