我有一个值列表,这些都是字母和数字的组合,用于制作ID,但在某些情况下,这可能只是一个0。
我需要删除这是0的所有场合。
我尝试过像
这样的东西For i = 0 the list.count - 1
If list(i) = "0" Then
list.RemoveAt(j)
End If
Next
但是这会在最后抛出一个超出范围异常的参数,因为循环继续,我不能使用Exit For,因为我需要检查多个零。
我不太擅长那些似乎做我想做的Lamda表达,并且不理解它们,所以如果有人可以给出并解释一个可行的,那就太棒了。
答案 0 :(得分:5)
使用LINQ或lambda表达式可以很容易地解决这个问题。
IEnumerable(Of T)接口包含一个名为RemoveAll
的方法。这个函数看起来有点令人生畏,因为它需要一个相当讨厌的参数,但它确实没有看起来那么糟糕。
因此传递给RemoveAll
的参数可以是匿名函数或函数的地址。对于这种情况,匿名函数是可行的方法。
要从符合条件的字符串列表中删除所有对象,您可以使用:
list.RemoveAll(Function(o) o="0")
这段简短的代码实际上做了很多事情。首先,它创建一个匿名函数,它接受一个字符串作为参数,并将该字符串的比较结果返回到文字“0”。接下来,RemoveAll
函数使用该匿名函数来评估list
的所有成员,并在匿名函数的计算结果为true时删除该对象。
<强>替代:强>
可以使用函数指针完成相同的代码。这种方法会产生更多的代码,但是你可以在比较逻辑中做更多的事情,而不仅仅是将每个值与文字进行比较。
我们仍然像以前一样调用RemoveAll
函数,但是这次我们传递的签名类似于Public Function <FunctionName>(byval Param As String) As Boolean
的函数的地址如果签名不匹配则会出错。< / p>
List.RemoveAll(AddressOf TestFunction)
接下来,我们在程序的其他位置定义该函数。
Public Function TestFunction(ByVal item As String) As Boolean
return item = "0"
End Function
答案 1 :(得分:2)
诀窍是向后循环
For i = thelist.count - 1 to 0 step -1
因为你要倒退,所以你不必担心随着时间的推移而改变你的指数。
答案 2 :(得分:2)
从列表的末尾开始,然后向后转向0
For i = list.count - 1 to 0 Step -1
If list(i) = "0" Then
list.RemoveAt(j)
End If
Next
如果你想使用带有lambda的linq,请使用Where保存所有不等于“0”的项目,并使用ToList
list = list.Where(function(value) value <> "0").ToList
这种情况下的lamda与
相同Function IsNotZero(value As String) As Boolean
return value <> "0"
End Function
答案 3 :(得分:0)
另一种方法是创建一个新的列表,它不包含&#34; 0&#34; -values
Dim newlist As List(Of String) = list.Where(function(v) v.Equals("0") = false).ToList()