listA是整数列表
dtListB是DataTable
我正在检查如果listA的StudentId在dtListB中不存在,则将其添加到dtListB。
Dim stidListA,stIdListB As Integer
For Each la In listA
stidListA = la.StudentId
For n = 0 To dtListB.Rows.Count - 1 Step 1
stIdListB = dtListB.Rows(n)("StudentId")
If stIdListB <> stidListA Then
dtListB.Rows.Add(New Object() {la.StudentId, la.AssignedId, la.TimeSheetId, 0})
End If
Next
Next
我不确定为什么会抛出错误:
抛出了类型'System.OutOfMemoryException'的异常。
dtListB.Rows.Add(New Object(){la.StudentId,la.AssignedId,la.TimeSheetId,0})
有什么建议吗?感谢。
答案 0 :(得分:1)
您正在使用dtListB.Rows
进行迭代并插入dtListB.Rows
。它正在增加Count
并且只是在不确定的时间内循环。
答案 1 :(得分:0)
问题是你没有真正检查if StudentId of ListA doesn't exist in dtListB
。您的代码实际上做的是将dtListB
中的 EVERY 元素与ListA
中的当前元素进行比较,如果它们不相同,则会向dtListB添加新行。所以假设您有以下列表:
ListA = { 3, 4 };
dtListB = { 1, 2, 3 };
ListA
的第一次迭代,值为3
。
Check: (3 <> 1) and add '3' to dtListB (dtListB = { 1, 2, 3, 3 })
Check: (3 <> 2) and add '3' to dtListB (dtListB = { 1, 2, 3, 3, 3 })
Check: (3 <> 3) and don't do anything.
(Since the list has grown, you have two more iterations)
对于值ListA
的{{1}}的第二次迭代,您将为与之比较的现有数组的每个元素插入5次,并获得结果列表:4
。显然,这不是你期望的结果,你可能有更大的列表和内存不足。
我建议在循环{ 1, 2, 3, 3, 3, 4, 4, 4, 4, 4 }
时保留Boolean
标记itemFound
。在循环之前将其设置为dtListB
,如果遇到匹配项,请将其设置为False
。在循环之后,检查True
是否为itemFound
,如果是,请将该项添加到列表中。这可能不是有效的VB语法,但你明白了:
False