使用For循环遍历它时删除列表中的项目

gro*_*it1 15 vb.net foreach loops list

我有一个名单,NeededList我需要检查此列表中的每个项目,看看它是否存在于我的数据库中.如果它确实存在于数据库中,我需要将其从列表中删除.但是当我迭代它时,我无法更改列表.我怎样才能做到这一点?

到目前为止,这是我的代码:

For Each Needed In NeededList
        Dim Ticker = Needed.Split("-")(0).Trim()
        Dim Year = Needed.Split("-")(1).Trim()
        Dim Period = Needed.Split("-")(2).Trim()
        Dim Table = Needed.Split("-")(3).Trim()
        Dim dr As OleDbDataReader
        Dim cmd2 As New OleDb.OleDbCommand("SELECT * FROM " & Table & " WHERE Ticker = ? AND [Year] = ? AND Period = ?", con)
        cmd2.Parameters.AddWithValue("?", Ticker)
        cmd2.Parameters.AddWithValue("?", Year)
        cmd2.Parameters.AddWithValue("?", Period)
        dr = cmd2.ExecuteReader
        If dr.HasRows Then
            NeededList.Remove(Needed)
        End If
Next
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 34

不,你不能使用for each,但你可以使用旧式for循环来做到这一点.
诀窍是从结束开始并向后循环.

For x = NeededList.Count - 1 to 0 Step -1
    ' Get the element to evaluate....
    Dim Needed = NeededList(x)
    .....
    If dr.HasRows Then
        NeededList.RemoveAt(x)
    End If
Next
Run Code Online (Sandbox Code Playgroud)

您需要以这种方式接近循环,因为您不会有跳过元素的风险,因为当前的元素已被删除.

例如,假设您删除集合中的第四个元素,之后,第五个元素成为第四个元素.但随后索引器上升到5.这样,前一个第五个元素(现在位于第四个位置)永远不会被评估.当然,您可以尝试更改索引器的值,但这总是在错误的代码和等待发生的错误中结束.

  • `Dim Needed = NeededList(x)`正如史蒂夫在代码的第二行那样. (2认同)

Hen*_*man 14

安全起见并制作副本ToList():

For Each Needed In NeededList.ToList()
    Dim Ticker = Needed.Split("-")(0).Trim()
    ...
    If dr.HasRows Then
        NeededList.Remove(Needed)
    End If
Next
Run Code Online (Sandbox Code Playgroud)