将列表添加到列表时会覆盖列表元素

时间:2016-06-14 14:56:32

标签: .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.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 

是一样的,我只是不明白为什么会这样?

2 个答案:

答案 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 ......