如何根据值从列表中删除对象,出现索引超出范围错误
'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)中的对象。
答案 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)
效率很低,因为它必须移动列表中的每个元素(列表不能有“空”空格)。如果您有一个概念性的清单,那么您将要添加和删除的清单很多,请考虑使用LinkedList
或HashSet
(如果元素的顺序无关紧要)。