如何在使用List.Clear()之前保留已创建的列表
当我向List
添加数据,然后将该列表附加到另一个列表,然后在原始列表上使用List.Clear()
时,它会清空所有内容,并且不会保留已附加的列表。
这是我正在谈论的一个例子。 可以说我制作了两个这样的列表:
List list = new List(); List<List> list2 = new List<List>(); 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> list2 = new List<List>(); for(int i=0;i<10;i++){ List list = new List(); //<- moved inside the for for(int i2=0;i2<10;i2++){ list.Add(i2); } list2.Add(list); }
但这是正常的行为吗? 是否可以保留预先附加的列表?
类通过引用传递, List
是一个类。 因此,当您清除列表时,它还会清除list2中引用传递的数据。 请参阅列表 – 我是否传递对象或引用? 更多细节。
这应解决您的示例中显示的问题,并在清除list
之前创建要添加到list2
的list
的新副本:
List list = new List (); List> list2 = new List>(); 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的参数传递C# ,了解有关如何在C#中传递参数的更广泛信息,尤其是与引用类型相关的信息。
你的解决方法不是解决方法; 这是正确的方法。
List是一个对象,因此是一个引用类型。 您的list
是整数值列表; list2
是对整数列表的引用列表 。
调用list.ToList()
有效的,因为该方法返回一个新列表。 从来源:
public static List ToList (this IEnumerable source) { if (source == null) throw Error.ArgumentNull("source"); return new List (source); }
这里有一些代码来说明值类型列表和引用类型列表之间的区别:
void Main() { int x = 0, y = 1, z = 2; var list = new List { x, y, z }; list.ForEach(i => Console.WriteLine(i)); x = y = z = 0; list.ForEach(i => Console.WriteLine(i)); WorseInt a = new WorseInt { Value = 0 }, b = new WorseInt { Value = 1 }, c = new WorseInt { Value = 2 }; var worseList = new List { a, b, c }; worseList.ForEach(i => Console.WriteLine(i.Value)); a.Value = b.Value = c.Value = 0; worseList.ForEach(i => Console.WriteLine(i.Value)); } public class WorseInt { public int Value { get; set; } }
输出:
0 1 2 0 1 2 0 1 2 0 0 0