你在想什么是一个笨拙措辞的问题?
当我的应用程序加载时,它会进入数据库并获取几个不同的数据查找表,并为每个查找表创建.NET列表并将它们放入缓存中。例如,“状态”。
此时列出: 上, 关
当我从缓存中检索状态列表时,我将另一个项添加到List,“Choose One”并将其设置为ComboBox的ItemsSource。除了状态列表之外,我在任何时候都不会放入新的List,现在包含“Choose One”。
List<ContractStatus> contractStatuses = (List<ContractStatus>)this._cacheManager["CurrentContractStatuses"];
ContractStatus contractStatus = new ContractStatus
{
ContractStatusDescription = "Choose One", ContractStatusId = 0
};
contractStatuses.Insert(0, contractStatus);
此时列出: 选一个, 上, 关
然而,如果我转到另一个屏幕并返回,屏幕的加载例程会从缓存中提取状态列表,并且选择一个已经在列表中。因此,当例程添加“选择一个”时,我结束了:
选择一个, 选一个, 上, 关
这是设计的吗?我怎么告诉它退出呢?
答案 0 :(得分:0)
缓存管理器正在向您的List<ContractStatus>
返回引用。此引用指向缓存中的对象。然后,您将一个项目插入到缓存中的相同列表中。
是否可以缓存包含“Choose One”的List版本,以便您只从缓存中读取List?如果是这样,那么应该避免你看到的“问题”。
如果您确实需要从缓存中操作List而不修改缓存中的List,那么您应该在操作之前克隆List:
List<ContractStatus> contractStatuses =
(List<ContractStatus>)this._cacheManager["CurrentContractStatuses"];
// Clone the list (but not the items)
List<ContractStatus> newStatuses =
contractStatuses.ConvertAll<ContractStatuses>(item => item);
ContractStatus contractStatus = new ContractStatus
{
ContractStatusDescription = "Choose One", ContractStatusId = 0
};
newStatuses.Insert(0, contractStatus);