C# 在C语言中更新协调词典#
我有两个作为缓存的字典,让我们称它们为C# 在C语言中更新协调词典#,c#,c#-4.0,C#,C# 4.0,我有两个作为缓存的字典,让我们称它们为d1和d2,其中d2是d1的一个子集 当我用d1的新条目刷新字典时,我希望d2中的条目也被刷新。这可以通过显而易见的方式实现: foreach(var update in updates) { d1[update.id] = update; if(d2.Contains(update.id)) d2[update.id] = update; } 但由于我想缓存其他子集(d3、d4、d5等),这可能会变得很难处理。因此,我在我
d1
和d2
,其中d2
是d1
的一个子集
当我用d1的新条目刷新字典时,我希望d2中的条目也被刷新。这可以通过显而易见的方式实现:
foreach(var update in updates) {
d1[update.id] = update;
if(d2.Contains(update.id))
d2[update.id] = update;
}
但由于我想缓存其他子集(d3、d4、d5等),这可能会变得很难处理。因此,我在我的对象中添加了一个“CopyFrom”方法,它允许我通过简单地将属性复制到正在更新的对象来维护引用
foreach(var update in updates) {
d1[update.id].CopyFrom(update)
}
这样,当d1
更新时,任何其他引用该条目的词典都不会丢失它
我只是想知道我是否遗漏了什么?休息一下,我刚回到C#,对显而易见的问题的理解可能不太清楚:)。为什么不创建一个包含有效负载(字典中的当前值)的CacheItem类呢。然后,为字典中的每个键存储一个包含当前存储内容的CacheItem。如果在多个字典中存储同一个CacheItem对象,则只需修改CacheItem的负载,包含它的所有字典都会更新
foreach(var update in updates) {
if (d1.ContainsKey(update.id)) {
var cacheItem = d1[update.id];
cacheItem.Payload = update;
} else {
d1[update.id] = new CacheItem(update);
}
}
我的回答假设您设计了多个词典,其中一些是主词典的子集,这是基于您的需求的,并且是解决这些问题的合理方法。这对我来说似乎有点不寻常。为什么不创建一个包含有效负载(字典中的当前值)的CacheItem类呢。然后,为字典中的每个键存储一个包含当前存储内容的CacheItem。如果在多个字典中存储同一个CacheItem对象,则只需修改CacheItem的负载,包含它的所有字典都会更新
foreach(var update in updates) {
if (d1.ContainsKey(update.id)) {
var cacheItem = d1[update.id];
cacheItem.Payload = update;
} else {
d1[update.id] = new CacheItem(update);
}
}
我的回答假设您设计了多个词典,其中一些是主词典的子集,这是基于您的需求的,并且是解决这些问题的合理方法。这对我来说似乎有点不寻常。如果字典的值是引用类型,并且您只需修改它,那么您就不需要做任何事情。如果您正在创建一个新引用或它是一个值类型,我会将子集更改为id类型的数组,这是您想要的子集。当你需要这个值时,你仍然会去d1访问它。如果字典的值是一个引用类型,你只需要修改它,你就不需要做任何事情了。如果您正在创建一个新引用或它是一个值类型,我会将子集更改为id类型的数组,这是您想要的子集。无论何时需要该值,您仍然可以访问d1。对于所有类型的缓存,请记住这一点
此外:.对于所有类型的缓存,请记住这一点
进一步:。请解释您试图实现的目标以及您需要多个词典的位置。基本上,我有一个非常大的词典,需要重新排列为各种“视图”。我希望缓存这些视图,而不是对每个请求执行动态LINQ查询(慢)。如果主词典值得到更新,我希望子词典值得到更新。对于视图,请使用仅包含相关键(不包含值)的列表。通过
d1[d2[index]]
进行查找。问题是,这需要对视图中的每个项目进行查找。如果我有数以百万计的记录,那就是大量的查找。此外,如果我想进一步子查询,我必须将其转储到一个新的列表或字典中?拥有数以百万计的重复缓存元素似乎是反对你自己想法的论点。请解释你试图实现的目标以及你需要多个字典的位置。基本上,我有一个非常大的字典,需要重新排列成各种“视图”。我希望缓存这些视图,而不是对每个请求执行动态LINQ查询(慢)。如果主词典值得到更新,我希望子词典值得到更新。对于视图,请使用仅包含相关键(不包含值)的列表。通过d1[d2[index]]
进行查找。问题是,这需要对视图中的每个项目进行查找。如果我有数以百万计的记录,那就是大量的查找。此外,如果我想进一步子查询,我必须将其转储到一个新的列表或字典中?拥有数以百万计的重复缓存元素似乎是与您的想法相反的论点。如果条目被分配d1[1]=o1
,然后我分配d2[1]=d1[1]
,则复制对对象o1
的引用,而不是对条目的引用。如果我更新d1[1]=o2
,那么d2[1]
仍然指向o1
@dcpar,我是说如果你不重新分配引用。如果您只执行d1[1].propName=“Hello World”,则可以从d2[1]观察到相同的更改。总的来说,你所拥有的似乎有点难以维持。如果要删除对象,必须遍历所有字典并删除对该对象的引用,否则会导致内存泄漏。不确定这是否是一个问题。你是对的,添加和删除肯定是这种方法的一个问题。这可以通过让父字典通过工厂生成子查询集合来解决,并附加一个添加/删除事件。如果条目被分配d1[1]=o1
,然后我分配d2[1]=d1[1]
,则复制对对象o1
的引用,而不是对条目的引用。如果我更新d1[1]=o2
,那么d2[1]
仍然指向o1
@dcpar,我是说如果你不重新分配引用。如果您只执行d1[1].propName=“Hello World”,则可以从d2[1]观察到相同的更改。总的来说,你所拥有的似乎有点难以维持。如果你想