如何将arraylist值传递给另一个arraylist.

steaddream 2005-10-26 10:16:08
如何将arraylist值传递给另一个arraylist.
...全文
993 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
swordragon 2005-10-26
  • 打赏
  • 举报
回复
还是用最土的方法来做吧:

ArrayList arraylist1 = new ArrayList();
arraylist1.Add("1");

ArrayList arraylist2 = new ArrayList();
for (int i = 0; i < arraylist1.Count; i++)
{
arraylist2.Add(arraylist1[i]);
}
s5689412 2005-10-26
  • 打赏
  • 举报
回复
哎,还是不扎实啊。其实很简单,直接用前一个ArrayList作为后一个ArrayList的构造函数参数,这样就等同于深层拷贝。

ArrayList myAL = new ArrayList();
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");
s5689412 2005-10-26
  • 打赏
  • 举报
回复
从你的回复来看,你就是需要分开操作,不然你也不会抱怨说:“但是你在改变a1的值时,am的值也在改变呀?”

深层拷贝的方法我在查找中,找到了再说。
steaddream 2005-10-26
  • 打赏
  • 举报
回复
〓〓怎样对两个ArrayList分别操作?????
s5689412 2005-10-26
  • 打赏
  • 举报
回复
GetRange方法用在这里有问题吧。
MSDN中说:此方法不创建元素的副本。新 ArrayList 只是一个进入源 ArrayList 的视图窗口。但是,随后对源 ArrayList 进行的所有更改必须通过此视图窗口 ArrayList 完成。如果直接对源 ArrayList 进行更改,则该视图窗口 ArrayList 将无效,对其执行的任何操作将返回 InvalidOperationException。

Clone方法创建浅表副本,仅复制集合的元素(不论它们是引用类型还是值类型),但不复制引用所引用的对象。新集合中的引用与原始集合中的引用指向相同的对象。如果要对两个ArrayList分别操作也有问题。

不过对于lz这么简单的描述,两者都可以用,只管传值,不管以后的事情,呵呵(听起来好不负责的口气)。
steaddream 2005-10-26
  • 打赏
  • 举报
回复
ArrayList al = new ArrayList();
al.Add("1");
ArrayList am = (ArrayList)al.Clone();
----------------------

但是你在改变a1的值时,am的值也在改变呀?

q_po_o 2005-10-26
  • 打赏
  • 举报
回复 1

int intN=arrLA.Count;
ArrayList arrLB= arrLA.GetRange( 0, intN);
hzw66 2005-10-26
  • 打赏
  • 举报
回复
ArrayList al = new ArrayList();
al.Add("1");
ArrayList am = (ArrayList)al.Clone();
s5689412 2005-10-26
  • 打赏
  • 举报
回复
呼,忙活了半天,找到了两种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 Class

dim arr as new arraylist

for i as integer = 1 to 100
arr.add(new theclass)
next

dim mem as new memroystream
dim bf as new binaryformatter

bf.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)
feiyun0112 2005-10-26
  • 打赏
  • 举报
回复
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);
}
steaddream 2005-10-26
  • 打赏
  • 举报
回复
你的代码是对的,但我ArrayList我的需求不是这样的.(请看上面我发的代码)谢谢.

s5689412 2005-10-26
  • 打赏
  • 举报
回复
不行???那请lz说明白点你到底要做什么了?我的代码是测试过的,是不能使用还是不符合你的需要,请说清楚,否则很难帮到你了。
steaddream 2005-10-26
  • 打赏
  • 举报
回复
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;}
}
}
steaddream 2005-10-26
  • 打赏
  • 举报
回复
土方法 还是 用前一个ArrayList作为后一个ArrayList的构造函数参数 都不行。

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧