gpt4 book ai didi

c# - 复制列表的二维数组

转载 作者:行者123 更新时间:2023-11-30 23:29:12 24 4
gpt4 key购买 nike

我有一个列表 List<MyClass>[,] myarraylist;它被填满了。

我要复制到List<MyClass>[,] mycopy然后更改mycopy不改变myarraylist .

最快的方法是什么?

最佳答案

这在某种程度上取决于您真正想做什么。您可以轻松克隆数组:

List<MyClass> mcopy = new List<MyClass>[marraylist.GetUpperBound(0)+1,marraylist.GetUpperBound(1)+1];
for (int i = 0; i < marraylist.GetUpperBound(0); ++i)
{
for (int j = 0; j < marraylist.GetUpperBound(1); ++j)
{
mcopy[i,j] = marraylist[i,j];
}
}

现在,这为您提供了数组的副本。但是,mcopy[1,2]marraylist[1,2] 引用了同一个列表。如果您修改该列表,也就是说,如果您要编写:

mcopy[1,2].Add(new MyClass(...));

然后这也会修改 marraylist[1,2] 中引用的列表。

如果你想创建列表的副本,那么你的内部循环中的代码必须是:

mcopy[i,j] = new List<MyClass>(marraylist[i,j]);

这会创建一个新列表,因此如果您修改 mcopy[1,2] 中的列表,您不会修改原始数组中的列表。

但这也可能不是您想要的。因为尽管 mcopy[1,2] 包含的列表与 marraylist[1,2] 不同,但列表具有相同的内容。因此,如果您编写了 mcopy[1,2][1].SomeProperty = 42;,那么您还将修改位于 marraylist[1,2][1] 的对象的内容,因为它们是同一个对象。

如果你想复制列表和对象的副本,那么你的内循环代码变成:

mcopy[i,j] = marraylist[i,j].Select(m => new MyClass(/* create from m */)).ToList();

/* create from m */ 注释意味着您要么将 m 传递给复制构造函数(如果有的话),要么传递单个参数,或者如果你在类上有一个克隆方法,你将使用它。您想以某种方式对 MyClass 实例进行深度复制。

是的,这很复杂。 “复制”这个词在这里用得太多了,你如何进行完全取决于你使用的“复制”的定义。你想复制数组(只复制引用)、数组的内容(用相同的对象创建新列表),还是列表的内容(用包含相同数据的新对象创建新列表)?

关于c# - 复制列表的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com