Реализация MultiMap - PullRequest
       8

Реализация MultiMap

1 голос
/ 23 ноября 2008

Я пишу простую абстракцию IDictionary в C #, которая оборачивает Словарь >. По сути, он отображает несколько значений на один ключ. Я не могу решить, следует ли удалить ключ и его пустой список, когда удаляется последний элемент в списке значений, или оставить его (чтобы не создавать экземпляр новой коллекции, если ключ используется повторно), и выполнить проверки значений ключа 'Count при определении, существует ли ключ.

Ответы [ 4 ]

4 голосов
/ 23 ноября 2008

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

Удаляет ли Clear () коллекции?

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

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

2 голосов
/ 23 ноября 2008

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

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

0 голосов
/ 23 ноября 2008

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

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

0 голосов
/ 23 ноября 2008

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

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