通用列表复制引用而不是创建copiedList

时间:2010-03-08 13:46:17

标签: vb.net generics reference

当我尝试在列表中运行枚举器然后执行某些操作时,我正在开发一个小函数。 (下面是我想要做的事情。

当我试图删除时,我得到了一个“收藏无法修改”,在我实际醒来之后,我意识到tempList必须刚刚被分配了myLists引用而不是myLists的副本。之后,我试图找到一种说法

tempList = myList.copy

然而似乎没有什么?我最后编写了一个小的for循环,然后将myLsit中的每个项目添加到tempList中,但我原以为会有另一种机制(如clone?)

所以我的问题:

  • 是我关于tempList接收对myList的引用的假设
  • 如何将列表复制到另一个列表?

        private myList as List (Of something)
    
    sub new()
        myList.add(new Something)
    end sub
    
    sub myCalledFunction()
        dim tempList as new List (Of Something)
        tempList = myList
        Using i as IEnumerator = myList.getEnumarator
           while i.moveNext
               'if some critria is met then 
               tempList.remove(i.current)
           end
        end using
    
    end sub
    

4 个答案:

答案 0 :(得分:8)

通过编写tempList = myList你没有复制集合,你只能使tempList引用myList。请改为尝试:dim tempList as new List (Of Something)(myList)

答案 1 :(得分:0)

尝试此操作 - 使用LINQ从原始列表创建新列表,例如:

Sub Main()
        Dim nums As New List(Of Integer)

        nums.Add(1)
        nums.Add(2)
        nums.Add(3)
        nums.Add(4)

        Dim k = (From i In nums _
                 Select i).ToList()

    For Each number As Integer In nums
        k.Remove(number)
    Next
    End Sub

k将是一个新的数字列表,它没有链接到源。

答案 2 :(得分:0)

我认为如果你调用myCalledFunction(byVal aListCopy as Something),你可以让框架完成工作。

答案 3 :(得分:0)

如果列表包含值类型,则可以使用构造函数中传递的旧列表创建新列表。如果您要对参考对象进行深层复制,最好的办法是让您的引用类型为ICloneableexample)。然后,您可以遍历并克隆每个对象,或者您可以添加扩展方法(例如此c#example)。