Я читал о С # ImmutableSortedDictionary
в System.Collections.Immutable
и думать о том , как применять его в своей программе. Мне очень нравятся C ++ lower_bound
и upper_bound
(см. Здесь ), и я скорее ожидал увидеть что-то подобное для поиска диапазона. Тем не менее, подобные методы, как ни странно, отсутствуют в документации . Я что-то пропустил? Или MS действительно предоставляет отсортированный словарь без эффективного доступа к отсортированным диапазонам? Это не совсем похоже на то, что можно сделать с одним IEnumerable
из ключей, как, например, метод расширения, поэтому я немного озадачен тем, что не вижу чего-то, предоставленного непосредственно коллекцией.
c#
.net
algorithm
immutability
immutable-collections
Дж Трана
источник
источник
IBinarySearchTree<K,V>
ее реализация выглядит ближе к тому, что я ожидал. Интересно, он когда-нибудь возился с этим дальше?ImmutableList<T>
Класс также реализован в виде дерева AVL. Из исходного кода :/// The root node of the AVL tree that stores this set.
ImmutableList<T>
(подкрепленные деревом AVL) передImmutableArray<T>
(подкрепленные массивом), согласно документации . Причины использования неизменяемого списка: 1) Обновление данных является распространенным явлением или число элементов не должно быть небольшим. 2) Обновление коллекции более критично для производительности, чем перебор содержимого.Ответы:
Вызывает раздражение тот факт, что доступные встроенные коллекции не предлагают полный набор функций (например,
SortedDictionary
отсутствиеBinarySearch
метода), что вынуждает нас искать сторонние решения (например, библиотеку C5). ).В вашем случае вместо a
ImmutableSortedDictionary
вы, вероятно, могли бы использовать aImmutableSortedSet
, встраивая значения в ключи и используя соответствующий компаратор. По крайней мере, API этого класса содержит свойстваMin
иMax
.источник
ImmutableList<T>
, реализован внутри как дерево . Так что это в 10 раз медленнее и выделяет в 12 раз больше памяти, чем aList<T>
. ИспользуйтеImmutableArray<T>
вместо этого.ImmutableSortedSet