还是用最土的方法来做吧:ArrayList arraylist1 = new ArrayList(); arraylist1.Add("1");ArrayList arraylist2 = new ArrayList(); for (int i = 0; i < arraylist1.Count; i++) { arraylist2.Add(arraylist1[i]); }
土方法 还是 用前一个ArrayList作为后一个ArrayList的构造函数参数 都不行。
ArrayList myAL = new ArrayList(); Test t = new Test(); t.AA = "111"; myAL.Add(t);ArrayList myALCopy = new ArrayList(myAL); t.AA = "222"; //这时看myALCopy也变了。 public class Test { private string aa; public string AA { get {return aa;} set {aa = value;} } }
你的代码是对的,但我ArrayList我的需求不是这样的.(请看上面我发的代码)谢谢.
ArrayList myAL = new ArrayList(); Test t = new Test(); t.AA = "111"; myAL.Add(t);ArrayList myALCopy = new ArrayList(); for (int i = 0; i < arraylist1.Count; i++) { Test tcopy = new Test(); tcopy.AA =((Test)myAL[i]).AA; myALCopy.Add(tcopy); }
呼,忙活了半天,找到了两种deep copy的方法,feiyun0112说了其中一种, 在微软的文档(http://samples.gotdotnet.com/quickstart/howto/doc/clone.aspx)中 也提到了这种方式,不过相比另外一种方式,我觉得还是不太好,因为如果一旦类的定义发生了变化,那么你将不得不搜索所有deep copy的客户代码来进行修改,如果数量很多的话,那会是一场恶梦。 第二种方法是为你的类实现ISerializable接口,这样修改了类定义之后也只需要修改ISerializable接口实现即可。 ISerializable接口如何实现请参看MSDN。 如何使用请参看下面的代码:(VB.NET代码,我没有时间再去修改了,请自行转换为C#) <Serializable()> _ Class TheClass ' make sure all the members are serializable :) .... End Classdim arr as new arraylistfor i as integer = 1 to 100 arr.add(new theclass) nextdim mem as new memroystream dim bf as new binaryformatterbf.serialize(mem, arr) mem.seek(seekorigin.begin) ' put the pointer back or you get an error.. dim newarr as arraylist = directcast(bf.deserialize(mem), theclass)
al.Add("1");
ArrayList am = (ArrayList)al.Clone();
int intN=arrLA.Count;
ArrayList arrLB= arrLA.GetRange( 0, intN);
al.Add("1");
ArrayList am = (ArrayList)al.Clone();
----------------------但是你在改变a1的值时,am的值也在改变呀?
MSDN中说:此方法不创建元素的副本。新 ArrayList 只是一个进入源 ArrayList 的视图窗口。但是,随后对源 ArrayList 进行的所有更改必须通过此视图窗口 ArrayList 完成。如果直接对源 ArrayList 进行更改,则该视图窗口 ArrayList 将无效,对其执行的任何操作将返回 InvalidOperationException。Clone方法创建浅表副本,仅复制集合的元素(不论它们是引用类型还是值类型),但不复制引用所引用的对象。新集合中的引用与原始集合中的引用指向相同的对象。如果要对两个ArrayList分别操作也有问题。不过对于lz这么简单的描述,两者都可以用,只管传值,不管以后的事情,呵呵(听起来好不负责的口气)。
myAL.Add( "The" );
myAL.Add( "quick" );
myAL.Add( "brown" );
myAL.Add( "fox" );
myAL.Add( "jumped" );
myAL.Add( "over" );
myAL.Add( "the" );
myAL.Add( "lazy" );
myAL.Add( "dog" );
ArrayList myALCopy = new ArrayList(myAL); myALCopy.RemoveAt(0);
myALCopy.Insert(0, "AAA");
arraylist1.Add("1");ArrayList arraylist2 = new ArrayList();
for (int i = 0; i < arraylist1.Count; i++)
{
arraylist2.Add(arraylist1[i]);
}
Test t = new Test();
t.AA = "111";
myAL.Add(t);ArrayList myALCopy = new ArrayList(myAL);
t.AA = "222";
//这时看myALCopy也变了。
public class Test
{
private string aa;
public string AA
{
get {return aa;}
set {aa = value;}
}
}
Test t = new Test();
t.AA = "111";
myAL.Add(t);ArrayList myALCopy = new ArrayList();
for (int i = 0; i < arraylist1.Count; i++)
{
Test tcopy = new Test();
tcopy.AA =((Test)myAL[i]).AA;
myALCopy.Add(tcopy);
}
在微软的文档(http://samples.gotdotnet.com/quickstart/howto/doc/clone.aspx)中
也提到了这种方式,不过相比另外一种方式,我觉得还是不太好,因为如果一旦类的定义发生了变化,那么你将不得不搜索所有deep copy的客户代码来进行修改,如果数量很多的话,那会是一场恶梦。
第二种方法是为你的类实现ISerializable接口,这样修改了类定义之后也只需要修改ISerializable接口实现即可。
ISerializable接口如何实现请参看MSDN。
如何使用请参看下面的代码:(VB.NET代码,我没有时间再去修改了,请自行转换为C#)
<Serializable()> _
Class TheClass
' make sure all the members are serializable :)
....
End Classdim arr as new arraylistfor i as integer = 1 to 100
arr.add(new theclass)
nextdim mem as new memroystream
dim bf as new binaryformatterbf.serialize(mem, arr)
mem.seek(seekorigin.begin) ' put the pointer back or you get an error..
dim newarr as arraylist = directcast(bf.deserialize(mem), theclass)