如何在使用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之前创建要添加到list2list的新副本:

 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