Ich lese über C # 's ImmutableSortedDictionary
in System.Collections.Immutable
und darüber nachzudenken , wie es in meinem Programm zu bewerben. Ich mag C ++ lower_bound
und upper_bound
(siehe hier ) sehr, und ich hatte eher erwartet, etwas Ähnliches für Range-Lookups zu sehen. Ähnliche Methoden scheinen jedoch in der Dokumentation seltsamerweise nicht vorhanden zu sein . Vermisse ich etwas Oder bietet MS wirklich ein sortiertes Wörterbuch ohne effizienten Zugriff auf die sortierten Bereiche? Das scheint nicht gerade etwas zu sein, das man an einem IEnumerable
der Schlüssel als Erweiterungsmethode tun könnte , also bin ich ein bisschen verwirrt, dass ich etwas nicht sehe, das direkt von der Sammlung bereitgestellt wird.
11
IBinarySearchTree<K,V>
Implementierung sieht näher an dem aus, was ich erwarten würde. Ich frage mich, ob er jemals weiter daran herumgebastelt hat.ImmutableList<T>
Klasse ist auch als AVL-Baum implementiert. Aus dem Quellcode :/// The root node of the AVL tree that stores this set.
ImmutableList<T>
(von einem AVL-Baum unterstützt) gegenüber demImmutableArray<T>
(von einem Array unterstützt) gemäß der Dokumentation . Gründe für die Verwendung einer unveränderlichen Liste: 1) Das Aktualisieren der Daten ist üblich oder es wird nicht erwartet, dass die Anzahl der Elemente gering ist. 2) Das Aktualisieren der Sammlung ist leistungskritischer als das Iterieren des Inhalts.Antworten:
Es ist irritierend, dass die verfügbaren integrierten Sammlungen nicht alle Funktionen bieten (wie das
SortedDictionary
Fehlen einerBinarySearch
Methode), was uns dazu zwingt, nach Lösungen von Drittanbietern (wie der C5-Bibliothek ) zu suchen .In Ihrem Fall
ImmutableSortedDictionary
könnten Sie anstelle von a wahrscheinlich a verwendenImmutableSortedSet
, die Werte in die Schlüssel einbetten und einen geeigneten Vergleicher verwenden. Zumindest die API dieser Klasse enthält die EigenschaftenMin
undMax
.quelle
ImmutableList<T>
, intern als Baum implementiert . Es ist also 10-mal langsamer und weist 12-mal mehr Speicher als a zuList<T>
. Verwenden SieImmutableArray<T>
stattdessen.ImmutableSortedSet