代码之家  ›  专栏  ›  技术社区  ›  Dean

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

  •  3
  • Dean  · 技术社区  · 16 年前

    我在开发一个小函数时,试图在列表中运行枚举器,然后执行一些操作。(下面是我的想法。

    当我试图删除时,我得到了一个“集合不能被修改”,在我真正醒来后,我意识到圣殿骑士一定是被分配了MyLists引用,而不是MyLists的副本。在那之后我试着想办法说

    templist=我的列表.copy

    但是似乎什么都不存在??我最后写了一个小for循环,然后把mylsit中的每一个条目都添加到templist中,但我本以为会有另一个机制(比如clone??)

    所以我的问题是:

    • 我关于圣殿骑士收到我的信的假设是正确的吗?
    • 如何将一个列表复制到另一个列表?

          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 回复  |  直到 15 年前
        1
  •  8
  •   Seb    16 年前

    通过写作 tempList = myList 你不会复制收藏,你只会让圣殿骑士引用我的列表。请改为: dim tempList as new List (Of Something)(myList)

        2
  •  0
  •   tobrien    16 年前

    我认为如果您调用mycalledfunction(byval alistcopy作为某种东西),您可以让框架完成工作。

        3
  •  0
  •   Community Mohan Dere    9 年前

    如果列表由值类型组成,则只需创建一个新列表,并在构造函数中传递旧列表。如果要对引用对象进行深度复制,最好的方法是实现引用类型 ICloneable ( example )然后可以循环并克隆每个对象,也可以添加一个扩展方法(如# example )

        4
  •  0
  •   Tim Cooper    15 年前

    尝试此操作-使用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 然后将是一个未链接到源的新数字列表。