2014-11-20 183 views
-2

我正在使用字典來創建DataRow列表的關鍵。我想遍歷每個鍵並刪除列表中的行。這會在我明確嘗試刪除一行時拋出一個超出範圍的異常。我如何改變我的代碼來完成這個任務?從DataRow列表中刪除一行

For Each g As KeyValuePair(Of [String], List(Of DataRow)) In grouped 

    For Each row As DataRow In g.Value 

     If CInt(segment(1)) <= 4 Then 
      'THIS THROWS AN OUT OF RANGE EXCEPTION 
      g.Value.Remove(row) 
     End If 
    Next 
Next 

我只想根據標準刪除特定的行。有人可以發表一個例子嗎?我在舊瀏覽器上的「添加評論」功能不起作用

你能展示一個如何使用基於row.Item(「ID」)的謂詞與RemoveAll函數的代碼示例嗎?

我嘗試這樣做,我得到一個異常

g.Value.RemoveAll(Function(l) l.Item(Con.ID) Is l.Item(Con.ID).ToString) 
+0

將它們向後迭代 – Plutonix 2014-11-20 16:30:27

+0

請勿使用foreach。對int i使用while循環,並且在刪除行時不增加。 – 2014-11-20 16:31:17

+0

我想你需要使用'For'而不是'For Each'。記錄需要刪除的所有行,然後刪除它們。 – Bolu 2014-11-20 16:33:28

回答

0

我想出了使用反向For循環。我沒有看到如何使用RemoveAll的檢查。如果您有時間,請發佈示例

   For i As Integer = g.Value.Count - 1 To 0 Step -1 
          Dim row As DataRow = CType(g.Value(i), DataRow) 

          Dim segment() As String = row.Item(c._ID).ToString.Split("-"c) 

          If CInt(segment(1)) <= 4 Then 
           g.Value.Remove(row) 
          End If 
         Next i 
3

使用List.RemoveAll。這不僅會比刪除某些形式的循環構造中的項目更容易,而且會更有效,因爲List可以在最後重新組織所有項目,而不是移動這些項目一次又一次下降一個索引。

+0

這是絕對正確的,但任何人都可以解釋'RemoveAll'如何幫助這裏,我認爲OP只想刪除某些項目? – Bolu 2014-11-20 16:38:29

+1

@Bolu和'RemoveAll'接受一個謂詞來決定哪個項目應該被刪除,這正是OP想要的。他已經有了一個謂詞來確定哪些項目在他的問題中保持正確。 「清除」將是無條件地將清單清空的方法。 – Servy 2014-11-20 16:39:21

+0

謝謝,以前不知道這個。對不起,如果我的評論在這裏引起一個-1。 – Bolu 2014-11-20 16:45:05