2015-03-16 4 views
12

Я новичок в .NET-программировании. Извините, если этот вопрос задан раньше.F #: Разница между Словарем, Hashtable и Map

В настоящее время я изучаю F #. В чем отличия между Словарем, Хэш-таблицей и Картой? Когда я должен использовать их каждый?

У меня также есть другой вопрос, который не упоминается в названии. Когда следует использовать Async.RunSynchronously? Мне кажется, что это противоречит мне, поэтому я уверен, что чего-то не хватает.

ответ

18

Выбор между Словарем, Hashtable и Map зависит от случаев использования. Однако вы должны знать характеристики каждого из них. Это не исчерпывающий список, а лишь некоторые ключевые различия вы можете начать с:

  • Hashtable Представляет коллекцию пар ключ/значение, которые организованы на основе хэш-кода ключа. Это измененная коллекция из .NET BCL
  • Словарь <> Это общая реализация хэш-таблицы. Также измененная коллекция из .NET BCL
  • Карта Это неизменяемый тип F #. Он реализован на основе AVL-деревьев, который представляет собой совершенно другую структуру данных с различными характеристиками производительности и вариантами использования.

Если вы делаете много записей, коллекции таблиц Hash имеют значительно лучшую производительность заполнения, чем деревья AVL.

Извлечение значения из словаря с помощью его ключа очень быстро, близко к O (1), потому что класс Dictionary реализован как хеш-таблица.

Карты F # реализованы как неизменные деревья AVL, эффективная структура данных, которая формирует самобалансирующееся двоичное дерево. Деревья AVL хорошо известны своей эффективностью, в которой они могут искать, вставлять и удалять элементы в дереве в O (log n) время, где n - количество элементов в дереве.

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

Async.RunSynchronously выполняет предоставленное асинхронное вычисление и ожидает его результата. Вы можете использовать его в интерактивном окне F #, например, для проверки асинхронных рабочих процессов.

+2

Как Томас указывает на выбор правильного ассоциативного контейнера, зависит от использования, но поскольку Карты неизменяемы, можно утверждать, что они лучше подходят для функционального стиля. – FuleSnabel

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