Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中更新协调词典#_C#_C# 4.0 - Fatal编程技术网

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]观察到相同的更改。总的来说,你所拥有的似乎有点难以维持。如果你想