我有以下代码:
Dim innerList As New List(Of String)
Dim outerList As New List(Of List(Of String))
For Each ds As datasource In datasources
selectedIdentifier = ds.identifier
Dim columnInfos As New List(Of Columns)
columnInfos = client.getColumns(token, selectedIdentifier)
For Each colInfo As Columns In columnInfos
innerList.Add(colInfo.code)
Next
outerList.Add(innerList)
innerList.Clear()
Next
我尝试做的是以下内容。我有不同的数据源。所有这些数据源都有不同的列名(= .code
),而列数也不同。我想将一个数据源的列名存储在列表(innerlist
)中,并将所有这些列表存储在另一个列表(outerList)中。
我不明白的是:在行设置一个限位器:outerList.Add(innerList)
该列表包含第一次迭代中当前数据源的正确数据。进入第二次迭代该列表保存第二个数据源的数据两次(显然第一个数据集的数据被第一个数据集的数据覆盖)。
outerlist (i) j and outerlist (i+1) j
是一样的,我只是不明白为什么会这样?
答案 0 :(得分:1)
innerList
始终引用相同的列表 instance ,因此您要清除它,然后将另一个引用添加到“外部”列表中。换句话说,outerlist (i)
和outerlist (i+1)
是相同的列表。
你可以改变
innerList.Clear()
到
innerList = New List(Of String)
每次创建一个新列表,或在循环中声明变量:
Dim outerList As New List(Of List(Of String))
For Each ds As datasource In datasources
Dim innerList As New List(Of String)
selectedIdentifier = ds.identifier
Dim columnInfos As New List(Of Columns)
columnInfos = client.getColumns(token, selectedIdentifier)
For Each colInfo As Columns In columnInfos
innerList.Add(colInfo.code)
Next
outerList.Add(innerList)
Next
请注意,您也可以使用Linq在单个查询中执行此操作,但我想说明您看到这些结果的原因。
答案 1 :(得分:1)
您正在为innerList
创建一个列表,并在每次迭代时将该引用添加到outerList
...因此您的outerList
最终会包含对同一列表的大量引用,因为你清除它,它最终会变空。您应该在每次迭代时创建一个新列表 - 我也在循环中声明innerList
:
Dim outerList As New List(Of List(Of String))
For Each ds As datasource In datasources
Dim innerList As New List(Of String)
...并在结尾删除对Clear()
的调用,否则您最终将会有大量对不同空列表的引用。
请注意,使用LINQ可以简化所有这些操作 - 您可以在大约5行代码中以更具说明性的方式完成所有操作。我会显示这些行,但由于VB中的查询语法与C#有些不同,我可能会错了 - 你应该看看LINQ ......