2

我有一个清单说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"]其中有处于原始状态的项目..

4

4 回答 4

5

如果列表项是对象,则您更改了源对象的属性。.ToList() 正在创建新的列表对象,它没有克隆项目。

换句话说,它将是具有相同项目的“另一个”列表。

要解决此问题,您应该克隆列表项。

于 2012-12-10T14:05:51.203 回答
3

对象将通过 ref 传递,您需要将列表内的数据复制到第二个列表,您不能使用 .ToList()。

您需要克隆原始列表中的项目,并将它们添加到第二个列表中,您可以手动复制值或使用 Clone()(如果可用)。

于 2012-12-10T14:06:42.850 回答
2

这是因为(很可能)至少根据您得到的结果,您的列表内容reference type.

将引用类型填充到列表的一个实例中并移到另一个实例中不会使其成为另一个实例。它继续是(是的不同的指针,但是..)指向相同的内存位置。所以不同的列表元素指向同一个位置,所以一个人所做的更改对另一个人是可见的。

要解决此问题,一种可能的解决方案是创建对象的克隆,或者至少只创建那些您将要更改的对象,前提是该更改在原始集合中不受软件架构的影响。这只是一个想法,您应该选择适合您需求的解决方案。

于 2012-12-10T14:04:57.350 回答
0

因为您使用的是进程内会话状态,所以 2 个列表实际上引用了该列表的同一个实例。您需要克隆您的列表才能真正拥有 2 个不同的列表。

现在,如果您使用 SQL 会话管理,这实际上最终会为您执行克隆,并且它们将是不同的,因为它将对象序列化/反序列化到数据库。

于 2012-12-10T14:09:01.740 回答