在VB.NET中从列表中删除特定值

时间:2015-10-15 16:21:32

标签: vb.net lambda

我有一个值列表,这些都是字母和数字的组合,用于制作ID,但在某些情况下,这可能只是一个0。

我需要删除这是0的所有场合。

我尝试过像

这样的东西
For i = 0 the list.count - 1
   If list(i) = "0" Then
       list.RemoveAt(j)
   End If
Next

但是这会在最后抛出一个超出范围异常的参数,因为循环继续,我不能使用Exit For,因为我需要检查多个零。

我不太擅长那些似乎做我想做的Lamda表达,并且不理解它们,所以如果有人可以给出并解释一个可行的,那就太棒了。

4 个答案:

答案 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()