我定义了两个ArrayList,AL1、AL2,然后AL2=AL1,然后进行了AL2.RemoveAt()操作,可是把AL2清空了以后,AL1也被清空了,有什么办法,让我只清空AL2,而不清空AL1吗?

解决方案 »

  1.   

    //AL2=AL1
    AL2= (ArrayList)AL1.Clone();
      

  2.   

    void Main()
    {
    ArrayList ay1=new ArrayList();
    for(int i=0;i<10;i++)
    {
      ay1.Add(i);
    }
    ArrayList ay2=new ArrayList();
    foreach(int i in ay1)
    {
    ay2.Add(i);
    }
     ay2.RemoveAt(3);
    Console.WriteLine(ay1);
    Console.WriteLine(ay2);
    }原因:ArrayList是引用类型
      

  3.   

    然后AL2=AL1,然后进行了AL2.RemoveAt()操作  AL2=AL1因为是引用传递的。 AL2指向的还是AL1的内存地址。改了AL2当然也改了AL1, 必需 AL2=NEW ArrayList();  AL2.ADD()新的值。
      

  4.   

    用ArrayList的Clone 方法如果你ArrayList不是值类型,则不要使用克隆方法,自己写克隆
      

  5.   

    本帖最后由 net_lover 于 2011-06-23 14:08:35 编辑
      

  6.   

    ArrayList是引用类型,
    l2 = l1.Clone() as ArrayList;
      

  7.   

    要clone才行。直接赋过去,只是一个reference而已。所以你删除原本的,reference那个也跟着没有了。
      

  8.   

    ArrayList已经被弃用了,除非你在维护老程序。否则请用List<object>代替。
      

  9.   


    顶!!!  用的较少了,主要性能考虑的。ArrayList 设计到装箱拆箱,很多问题, 如果你非要用 这个两个都可以
                 ArrayList d3 = new ArrayList();
                d3.Add("测试数据");
                ArrayList c3= (ArrayList) d3.Clone();
                ArrayList fq = new ArrayList(d3);
    还有去遍历一个一个添加,也行。不怎么建议