Czytałam o C # 's ImmutableSortedDictionary
w System.Collections.Immutable
i myślenie o tym, jak ją stosować w moim programie. Bardzo lubię C ++ lower_bound
i upper_bound
(patrz tutaj ), i raczej spodziewałem się czegoś w rodzaju wyszukiwania zakresów. Jednak podobne metody wydają się dziwnie nieobecne w dokumentacji . Czy coś brakuje? Czy też MS naprawdę zapewnia posortowany słownik bez skutecznego dostępu do posortowanych zakresów? Nie wydaje się, że to coś, co można zrobić na jednym IEnumerable
z klawiszy, jak powiedzmy metodę rozszerzenia, więc jestem trochę zaskoczony, że nie widzę czegoś dostarczonego bezpośrednio przez kolekcję.
11
IBinarySearchTree<K,V>
implementacja wygląda bliżej tego, czego się spodziewałam. Zastanawiam się, czy kiedykolwiek w dalszym ciągu majstrował przy tym?ImmutableList<T>
Klasa jest również zaimplementowany jako drzewo AVL. Z kodu źródłowego :/// The root node of the AVL tree that stores this set.
ImmutableList<T>
(wspierane przez drzewo AVL) nadImmutableArray<T>
(wspierane przez tablicę), zgodnie z dokumentacją . Powody korzystania z niezmiennej listy: 1) Aktualizowanie danych jest powszechne lub liczba elementów nie powinna być niewielka. 2) Aktualizacja kolekcji ma większe znaczenie dla wydajności niż iteracja zawartości.Odpowiedzi:
To irytujące, że dostępne wbudowane kolekcje nie oferują pełnego zestawu funkcji (takich jak
SortedDictionary
brakBinarySearch
metody), zmuszając nas do szukania rozwiązań innych firm (takich jak biblioteka C5 ).W twoim przypadku zamiast
ImmutableSortedDictionary
możesz prawdopodobnie użyć aImmutableSortedSet
, osadzając wartości w kluczach i używając odpowiedniego modułu porównującego. Przynajmniej interfejs API tej klasy zawiera właściwościMin
iMax
.źródło
ImmutableList<T>
, jest zaimplementowana wewnętrznie jako drzewo . Jest więc 10 razy wolniejszy i przydziela 12 razy więcej pamięci niż aList<T>
. UżyjImmutableArray<T>
zamiast tego.ImmutableSortedSet