.net 将列表添加到列表时,列表元素将被覆盖
我有以下代码:.net 将列表添加到列表时,列表元素将被覆盖,.net,vb.net,list,.net,Vb.net,List,我有以下代码: 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.getColu
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
都是相同的,我只是不明白为什么会发生这种情况?
innerList
始终引用同一个列表实例,因此您正在清除它,然后向“外部”列表添加另一个引用。换句话说,outerlist(i)
和outerlist(i+1)
是相同的列表
你可以改变
innerList.Clear()
到
要每次创建新列表,或在循环中声明变量,请执行以下操作:
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
请注意,您也可以使用在单个查询中执行此操作,但我想说明您看到这些结果的原因。
innerList
始终引用同一个列表实例,因此您正在清除它,然后向“outer”列表添加另一个引用。换句话说,outerlist(i)
和outerlist(i+1)
是相同的列表
你可以改变
innerList.Clear()
到
要每次创建新列表,或在循环中声明变量,请执行以下操作:
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
请注意,您也可以使用在单个查询中执行此操作,但我想说明您看到这些结果的原因。您正在为
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…您正在为
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…请不要在与C无关的问题中使用C标记。请不要在与C无关的问题中使用C标记。