2008-11-23 1 views
1

Я пишу простую абстракцию IDictionary в C#, которая обертывает Словарь < K, ICollection <V> >. В принципе, он отображает несколько значений в один ключ. Я не могу решить, удалить ли ключ и его пустой список, когда последний элемент в списке значений удален или оставить его (чтобы избежать создания экземпляра новой коллекции при повторном использовании ключа) и выполнить проверки значений ключа «Count» при определении наличия ключа.Реализация MultiMap

ответ

4

Я бы удалил коллекции, чтобы ваш MultiMap имел последовательное поведение. Если бы я использовал ваш MultiMap, я был бы очень удивлен (и недоволен), обнаружив, что недостающий ключ ведет себя по-разному в зависимости от того, был ли ранее ключ в MultiMap или нет.

Удалить() удалить Коллекции?

Вы также можете создать непреднамеренную утечку памяти, если вы не удалите коллекции. Разработчик может добавить много элементов, а затем удалить их. Использование памяти (после GC) должно возвращаться к той же сумме, что и до добавления этих элементов.

Я не стал бы беспокоиться о стоимости создания Коллекций. Я буду беспокоиться о контракте, который вы создаете для своей MultiMap. Если после профилирования вашего приложения вы обнаружите, что это касается, вы можете изменить или создать специальный MultiMap для этого поведения. Не попадайте в ловушку преждевременной оптимизации.

0

Почему не обрабатывать ключ как присутствующий, даже если все значения удалены и предоставить явный API для удаления ключа?

0

Это зависит от типа использования. Если вы собираетесь добавлять и удалять множество элементов, тогда эти пустые коллекции будут использовать память. Я предполагаю, что вы не сможете сэкономить много времени, сохранив коллекции. Как всегда, если это важно для вашей работы, вы должны измерить, а не гадать, какой путь лучше.

Если вы действительно думаете, что создание этих коллекций дорого, то вместо того, чтобы создавать новые все время, поместите неиспользованные в список и повторно используйте их, когда новые ключи будут добавлены в ваш хэш. Я думаю, что это может быть мухи. Вероятно, вы должны сохранить список неиспользуемых коллекций менее половины размера основной хэш-карты (опять же, измерить, как отношение влияет на производительность).

2

В .NET 3.5 есть ILookup<TKey,TValue> и Lookup<TKey,TValue>, которые действуют как мульти-карта. Встроенная реализация (Lookup<TKey,TValue>) является неизменной, но я написал EditableLookup<TKey,TValue> в miscutil.

В этой версии; yes - я удаляю ключ, если последний элемент (с этим ключом) удален. Это облегчает поиск ключей (т. Е. .Keys и т. Д.).

 Смежные вопросы

  • Нет связанных вопросов^_^