C# 清单参考问题c

C# 清单参考问题c,c#,asp.net,linq,C#,Asp.net,Linq,我有一个列表,上面写着listOriginal,并将其存储在Viewstate中 ViewState["Origion"] = listPatientEncounter; 现在,我需要对列表项进行一些格式化,并将其保存在另一个Viewstate上以供进一步使用 List<....> listCopy = new List<....>(); listCopy= (from n in listOriginal select n).ToList(); //This m

我有一个列表,上面写着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);

但是,问题是,在第二个列表中所做的更改也会在第一个列表上显示op,因此我在使用ViewState[Origion]时遇到了问题,因为它的项目处于其原始区域状态。

这是因为最有可能至少根据您得到的结果,您的列表的内容是引用类型

在列表的一个实例中填充引用类型并将其移动到另一个实例中不会使其成为另一个实例。它可能是不同的指针,但是。。指向相同的内存位置。因此,不同的列表元素指向相同的位置,因此一个元素所做的更改可以被另一个元素看到


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

如果列表项是一个对象,那么您可以更改源对象的属性。 .ToList正在创建新的列表对象,而不是克隆项

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


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

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


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

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


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

请您详细说明一下……我已经将项目从原始列表复制到listCopy,然后也应用toList方法。。!!我会将它们存储在会话中,而不是更好,根本不存储它们,而是始终从数据库中检索它们。因为ViewState必须被序列化,并且将被发送到客户端并返回到服务器,所以它会浪费带宽。会话不会导致额外的通信量和序列化,因为默认情况下变量存储在memoryby中。