我有一个列表List<MyClass>[,] myarraylist;
,它已经被填充了。
我想将其复制到List<MyClass>[,] mycopy
,然后更改mycopy
而不更改myarraylist
。
最快的方法是什么?
我有一个列表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
实例进行深层次复制。var newList = new List<MyClass>[oldList.GetLength(0), oldList.GetLength(1)];
for (int i = 0; i < oldList.GetLength(0); i++)
for (int j = 0; j < oldList.GetLength(1); j++)
newList[i, j] = oldList[i, j].Select(x => new MyClass(x)).ToList();
newList[i, j] = oldList[i, j].Select(x => CloneMyClass(x)).ToList();
MyClass
实例的二维数组,而是一个List<MyClass>
的二维数组。 - Jim Mischelpublic static IEnumerable<IEnumerable<T>> Clone<T>(this IEnumerable<IEnumerable<T>> twoDList) where T : ICloneable
{
if (twoDList != null)
{
List<List<T>> result = new List<List<T>>();
for (int i = 0; i < twoDList.Count(); i++)
{
List<T> aList = new List<T>();
for (int j = 0; j < twoDList.ElementAt(i).Count(); j++)
{
aList.Add(twoDList.ElementAt(i).ElementAt(j));
}
result.Add(aList);
}
return result;
}
else
{
return null;
}
}
List<List<MyClass>> cloned = original2DStructure.Clone();
关于如何使你的类实现 ICloneable
的帮助可以在这里找到。
List<什么>[,]
? - Blorgbeard<MyClass>
。那么,你希望mycopy
拥有所有MyClass
实例的副本吗? - Blorgbeard<MyClass>
被剥离了,因为它看起来像 HTML,所以我只能看到 "List[,] mycopy"。 - Blorgbeard