C# 在应用程序状态下存储通用列表

C# 在应用程序状态下存储通用列表,c#,generics,caching,C#,Generics,Caching,我正在使用C#和ASP.NET3.5 我在HttpContext.Current.Application中存储了一个通用列表,这样网站的所有页面都可以访问它。当我将其值分配给本地页面上的某个局部变量以供某些局部使用时,我对该局部变量所做的任何更改都会反映回应用程序状态的原始列表中。当我在本地分配应用程序状态变量时,就好像直接引用了它一样 下面是一些示例代码,它实例化了一个局部泛型列表变量,向该变量添加了3个字符串,将该变量添加到应用程序状态,从该局部变量中删除了一个项,并在执行过程中打印出计数。

我正在使用C#和ASP.NET3.5

我在HttpContext.Current.Application中存储了一个通用列表,这样网站的所有页面都可以访问它。当我将其值分配给本地页面上的某个局部变量以供某些局部使用时,我对该局部变量所做的任何更改都会反映回应用程序状态的原始列表中。当我在本地分配应用程序状态变量时,就好像直接引用了它一样

下面是一些示例代码,它实例化了一个局部泛型列表变量,向该变量添加了3个字符串,将该变量添加到应用程序状态,从该局部变量中删除了一个项,并在执行过程中打印出计数。结果是,在应用程序状态下,从局部变量中删除的一项也从相应的列表中删除

    -- generic list in Application state
    Response.Write("<BR><BR><b>list (generic) example in Application</b><BR><BR>");
    List<string> productList = new List<string>();
    productList.Add("1");
    productList.Add("2");
    productList.Add("3");
    HttpContext.Current.Application["productList"] = productList;
    Response.Write("product segments: " + productList.Count + "<BR>");
    Response.Write("product segments in application cache: " + ((List<string>)HttpContext.Current.Application["productList"]).Count + "<BR>");

    productList.Remove("1");

    Response.Write("product segments: " + productList.Count + "<BR>");
    Response.Write("product segments in application cache: " + ((List<string>)HttpContext.Current.Application["productList"]).Count + "<BR>");
——处于应用程序状态的通用列表
响应。写(“

应用程序中的列表(通用)示例

”; List productList=新列表(); 产品列表。添加(“1”); 产品列表。添加(“2”); 产品列表。添加(“3”); HttpContext.Current.Application[“productList”]=productList; 响应。写入(“产品段:“+productList.Count+”
”; Response.Write(“应用程序缓存中的产品段:”+((列表)HttpContext.Current.application[“productList”])).Count+“
”; 产品列表。删除(“1”); 响应。写入(“产品段:“+productList.Count+”
”; Response.Write(“应用程序缓存中的产品段:”+((列表)HttpContext.Current.application[“productList”])).Count+“
”;
您可以在aspx文件中运行此代码,并亲自查看结果

问题:如何在应用程序状态中存储泛型,以便将它们分配给局部变量,并且对该局部变量的更改不应传播回应用程序状态变量

顺便说一下,这也发生在会话状态中。在应用程序或会话中存储泛型,我缺少什么

谢谢你的帮助。

试试以下方法:

List<string> localList = new List<string>((List<string>)HttpContext.Current.Application["productList"]);
List localList=newlist((List)HttpContext.Current.Application[“productList]”);

在您的版本中,实际上是通过本地引用变量修改存储的产品列表。如果您不希望更改传播回主列表,则需要创建列表的本地副本(上面的代码就是这样做的)。

您的问题是列表是引用类型,因此当您将productList分配给上下文时……实际上您只添加了对原始列表的引用。这就是为什么两个位置都会出现变化

您需要克隆列表,而不仅仅是将现有列表分配给上下文。根据您是否需要浅拷贝和深拷贝,您可以使用以下代码:

HttpContext.Current.Application["productList"] = 
    new List<string>(productList);
HttpContext.Current.Application[“productList”]=
新列表(产品列表);

HttpContext.Current.Application[“productList”]=
新列表(productList.Select(item=>item.Clone()).ToList());

谢谢你,这让我脑子里一片混乱。我想过要这么做,但不知道为什么要这么做。谢谢你的帮助。
HttpContext.Current.Application["productList"] = 
    new List<string>(productList.Select(item => item.Clone()).ToList());