Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将列表添加到列表时,列表元素将被覆盖_.net_Vb.net_List - Fatal编程技术网

.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标记。