Estaba leyendo sobre C # 's ImmutableSortedDictionary
en System.Collections.Immutable
y pensando acerca de cómo aplicarlo en mi programa. Me gustan bastante los C ++ lower_bound
y upper_bound
(ver aquí ), y esperaba ver algo parecido para las búsquedas de rango. Sin embargo, métodos similares parecen estar extrañamente ausentes de la documentación . ¿Me estoy perdiendo de algo? ¿O MS realmente proporciona un diccionario ordenado sin acceso eficiente a los rangos ordenados? Eso no parece exactamente algo que uno podría hacer en una IEnumerable
de las teclas como decir un método de extensión, por lo que estoy un poco perplejo porque no veo algo proporcionado directamente por la colección.
11
IBinarySearchTree<K,V>
implementación se parece más a lo que esperaría. Me pregunto si alguna vez lo jugó más.ImmutableList<T>
clase también se implementa como un árbol AVL. Del código fuente :/// The root node of the AVL tree that stores this set.
ImmutableList<T>
(respaldado por un árbol AVL) sobreImmutableArray<T>
(respaldado por una matriz), de acuerdo con la documentación . Razones para usar la lista inmutable: 1) Actualizar los datos es común o no se espera que el número de elementos sea pequeño. 2) Actualizar la colección es más crítico para el rendimiento que iterar los contenidos.Respuestas:
Es irritante que las colecciones incorporadas disponibles no ofrezcan un conjunto completo de características (como la
SortedDictionary
falta de unBinarySearch
método), lo que nos obliga a buscar soluciones de terceros (como la biblioteca C5 ).En su caso, en lugar de un
ImmutableSortedDictionary
, probablemente podría usar unImmutableSortedSet
, incrustando los valores en las claves y usando un comparador apropiado. Al menos la API de esta clase contiene las propiedadesMin
yMax
.fuente
ImmutableList<T>
, se implementa internamente como un árbol . Por lo tanto, es 10 veces más lento y asigna 12 veces más memoria que aList<T>
. Usar en suImmutableArray<T>
lugar.ImmutableSortedSet