Обновление согласованных словарей в C # - PullRequest
0 голосов
/ 10 августа 2011

У меня есть два словаря, которые действуют как кеш, давайте назовем их d1 и d2, где d2 - это подмножество a из 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 # после перерыва, и мое понимание очевидного может быть шатким:).

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Почему бы не иметь класс CacheItem, который содержит полезную нагрузку (текущие значения в ваших словарях).Затем для каждого ключа в своих словарях сохраните CacheItem, содержащий то, что вы в данный момент храните.Если вы храните один и тот же объект CacheItem в нескольких словарях, вам нужно только изменить полезную нагрузку CacheItem, и все словари, в которых он содержится, обновлены.некоторые из них являются подмножествами основного и основаны на ваших требованиях и являются надежным способом их решения.Это кажется мне немного необычным.

1 голос
/ 10 августа 2011

Хорошо, если значение словаря является ссылочным типом, а вы только изменяете его, вам не нужно ничего делать. Если вы создаете новую ссылку или это тип значения, я бы изменил подмножества на массивы типа id, который является подмножеством, которое вы хотите иметь. И всякий раз, когда вам нужно это значение, вы все равно переходите к d1 для доступа к нему.

0 голосов
/ 10 августа 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...