让我们创建一个名为 i_Changes 的List<List<int>>
类型的变量,该变量具有以下值:
[1] = 1,2
[2] = 3,4,6
[3] = 4,8,15
此变量存储在类 myClass 中,如下所示:
Public Class myClass
{
public DateTime selectedDate {get; set}
public List<List<int>> i_Changes {get;set;}
}
现在我们有另一个名为 i_Holder 的类型为List<List<List<int>>>
的变量,该变量应该包含i_Changes的值(这意味着在每次迭代后我都要存储来自i_Changes的确切数字以便稍后(在处理之后)我可以在网格中向用户显示它们。
我在每次迭代后做的事情,存储新变量如下:
i_Holder.Add(myClass.Select(n=>n.i_Changes).ToList();
我发现当我像这样添加项目时,它们会与原始的 i_Changes 保持绑定,这意味着在每次迭代后(当i_Changes下的值发生变化时),i_Holder下的所有值相应地改变 - &gt;这意味着我列出了具有完全相同值的n个项目,例如当前 i_Changes 。
我该如何解决这个问题?
另外,如果您认为List<List<List<int>>>
不是一个好主意,请随时纠正我,因为这是我唯一能想到的。
谢谢
修改
我发现当我创建新的List<List<int>>
并手动将每个值复制到该列表时,绑定就会丢失;但是我认为这不是最好的事情(每次迭代后创建新的List)。有没有更好的方法呢?
答案 0 :(得分:2)
您正在保存对同一对象的引用列表,因此当对象发生更改时,您将看到列表中每个项目的更改。
每次都需要创建一个包含所需值的新列表,如下所示:
i_Holder.Add(myClass
.Select(n => n.i_Changes.Select(j => new List<int>(j)).ToList()).ToList());
答案 1 :(得分:1)
在C#中,列表是通过引用传递的,所以我认为这就是你遇到这个问题的原因。为了避免这种情况,您必须在添加列表之前对其进行深层复制。
您可以阅读有关列表here
的深度克隆的信息