Обычной функциональной структурой данных для представления словарей, доступной в F #, является Map
(как указано larsmans).Под прикрытием это реализовано в виде сбалансированного двоичного дерева, поэтому сложность поиска составляет O (log N) для дерева, содержащего N элементов.Это медленнее, чем словарь на основе хеша (который имеет O (1) для хороших ключей хеширования), но он позволяет добавлять и удалять элементы без копирования всей коллекции - необходимо изменить только часть дерева.
Из вашего описания у меня сложилось впечатление, что вы будете создавать структуру данных только один раз, а затем использовать ее в течение длительного времени без ее изменения.В этом случае вы можете реализовать простой неизменяемый тип-обертку, который использует Dictionary<_, _>
под обложкой, но принимает все элементы как последовательность в конструкторе и не допускает изменений:
type ImmutableMap<'K, 'V when 'K : equality>(data:seq<'K * 'V>) = // '
// Store data passed in constructor in hash-based dictionary
let dict = new System.Collections.Generic.Dictionary<_, _>()
do for k, v in data do dict.Add(k, v)
// Provide read-only access
member x.Item with get(k) = dict.[k]
let f = new ImmutableMap<_,_ >( [1, "Hello"; 2, "Ahoj" ])
let str = f.[1]
Это должно бытьбыстрее, чем использование F # Map
, если вам не нужно изменять коллекцию (или, точнее, создавать копии с добавленными / удаленными элементами).