我有一个列表说listOriginal
并将其存储在Viewstate ..
ViewState["Origion"] = listPatientEncounter;
现在,我需要在列表项中进行一些格式化并将其保存在另一个Viewstate中以供进一步使用..
List<....> listCopy = new List<....>();
listCopy= (from n in listOriginal select n).ToList();
//This method formattes a few listCopy items
ViewState["copylist"] = ConverttoUTCTime(listCopy);
但问题是,第二个列表中所做的更改也会在第一个列表中显示操作,因此我遇到问题,我想使用ViewState["Origion"]
,其中包含项目的原始状态。
答案 0 :(得分:5)
如果列表项是对象,则更改源对象的属性。 .ToList()正在创建新的列表对象,而不是克隆项目。
换句话说,它将是具有相同项目的“另一个”列表。
要解决此问题,您应该克隆列表项。
答案 1 :(得分:3)
对象将由ref传递,你需要将列表中的数据复制到第二个列表,你不能使用.ToList()。
您需要克隆原始列表中的项目,并将它们添加到第二个项目,您可以手动复制值或使用Clone()(如果可用)。
答案 2 :(得分:2)
这是因为(最有可能)至少根据你得到的结果,你的列表的内容是reference type
。
在列表的一个实例中填充引用类型并移动到另一个实例中不会使其成为另一个实例。它可以指向(是不同的指针,但是......)指向相同的内存位置。因此,不同的列表元素指向相同的位置,因此一个人所做的更改会被另一个人看到。
要解决此问题,可能的解决方案之一是创建对象的克隆,或者至少只创建您要更改的对象,如果原始集合中的更改没有受到影响强>通过软件架构。这只是一个想法,你应该选择一个符合你需求的解决方案。
答案 3 :(得分:0)
因为您正在使用进程内会话状态,所以2个列表实际上引用了列表的同一实例。您需要克隆列表才能真正拥有2个不同的列表。
现在,如果您正在使用SQL会话管理,这实际上最终将为您执行克隆,并且它们将是截然不同的,因为它将对象序列化/反序列化为数据库。