当我将数据添加到 List
,然后将该列表附加到另一个列表,然后在原始列表上使用 List.Clear()
时,它会清空所有内容并已附加的列表不会保留。
这是我正在谈论的例子。假设我制作了 2 个这样的列表:
List<int> list = new List<int>();
List<List<int>> list2 = new List<List<int>>();
for(int i=0;i<10;i++){
for(int i2=0;i2<10;i2++){
list.Add(i2);
}
list2.Add(list);
list.Clear();
}
当我运行 list.Clear()
时,它会清除我已经附加到 list2
的所有预先存在的列表
我知道一个解决方法是像这样重新安排代码:
List<List<int>> list2 = new List<List<int>>();
for(int i=0;i<10;i++){
List<int> list = new List<int>(); //<- moved inside the for
for(int i2=0;i2<10;i2++){
list.Add(i2);
}
list2.Add(list);
}
但这是正常行为吗?是否可以保留预先附加的列表?
最佳答案
类通过引用传递并且List<T>
是一个类。因此,当您清除列表时,它也会清除 list2 中通过引用传递的数据。参见 List - do I pass objects or references?了解更多详情。
这应该可以解决示例中显示的问题并创建 list
的新副本添加到 list2
清理前list
:
List<int> list = new List<int>();
List<List<int>> list2 = new List<List<int>>();
for(int i=0;i<10;i++){
for(int i2=0;i2<10;i2++){
list.Add(i2);
}
list2.Add(list.ToList()); //modified to create a new List when adding
list.Clear();
}
另见 Jon Skeet 的 Parameter passing in C#有关如何在 C# 中传递参数的更广泛信息,尤其是与引用类型相关的信息。
关于c# - 如何保留在使用 List.Clear() 之前已经创建的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903388/