Eu estava lendo sobre C # 's ImmutableSortedDictionary
em System.Collections.Immutable
e pensar sobre como aplicá-la no meu programa. Eu gosto bastante de C ++ lower_bound
e upper_bound
(veja aqui ), e esperava ver algo do tipo para pesquisas de intervalo. No entanto, métodos semelhantes parecem estar estranhamente ausentes da documentação . Estou esquecendo de algo? Ou o MS realmente fornece um dicionário classificado sem acesso eficiente aos intervalos classificados? Isso não parece exatamente algo que alguém poderia fazer em uma IEnumerable
das teclas como, por exemplo, um método de extensão, por isso estou um pouco confuso por não estar vendo algo fornecido diretamente pela coleção.
11
IBinarySearchTree<K,V>
implementos parecem mais próximos do que eu esperaria. Será que ele alguma vez pensou nisso?ImmutableList<T>
classe também é implementada como uma árvore AVL. A partir do código fonte :/// The root node of the AVL tree that stores this set.
ImmutableList<T>
(suportado por uma árvore AVL) sobre oImmutableArray<T>
(suportado por uma matriz), de acordo com a documentação . Razões para usar a lista imutável: 1) A atualização dos dados é comum ou o número de elementos não é pequeno. 2) Atualizar a coleção é mais crítico em termos de desempenho do que iterar o conteúdo.Respostas:
É irritante que as coleções internas disponíveis não estejam oferecendo um conjunto completo de recursos (como a
SortedDictionary
falta de umBinarySearch
método), forçando-nos a procurar soluções de terceiros (como a biblioteca C5 ).No seu caso, em vez de um,
ImmutableSortedDictionary
você provavelmente poderia usar aImmutableSortedSet
, incorporando os valores nas chaves e usando um comparador apropriado. Pelo menos a API desta classe contém as propriedadesMin
eMax
.fonte
ImmutableList<T>
, é implementada internamente como uma árvore . Portanto, é 10 vezes mais lento e aloca 12 vezes mais memória que aList<T>
. Use emImmutableArray<T>
vez disso.ImmutableSortedSet