c# - 如何保留在使用 List.Clear() 之前已经创建的列表

标签 c# asp.net

当我将数据添加到 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/

相关文章:

c# - 我可以利用 ViewState 来消除传递查询字符串的需要吗?

c# - 复杂分组依据

c# - 如何在 WPF 中创建计时器?

带有 [Flags] 枚举的 ASP.NET 控件属性

ASP.NET - 避免硬编码路径

c# - Asp.net 核心代码优先数据库迁移

c# - 如何在 PowerPoint 中锁定形状?

c# - 清理 .net 中的用户 HTML

c# - 如何使用 itextsharp 并排放置两个表

asp.net - 两个 Azure VM 之间的延迟