Enhanced C#
Language of your choice: library documentation

Documentation moved to ecsharp.net

GitHub doesn't support HTTP redirects, so you'll be redirected in 3 seconds.

 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Events Pages
Properties | Public Member Functions | Protected Member Functions | Protected fields | Protected static fields | List of all members
Loyc.Collections.BDictionary< K, V > Class Template Reference

An sorted dictionary that is efficient for all operations and offers indexed access to its list of key-value pairs. More...


Source file:
Inheritance diagram for Loyc.Collections.BDictionary< K, V >:
Loyc.Collections.AListBase< K, T > Loyc.Collections.ICollectionEx< T > Loyc.Collections.IAddRange< T > Loyc.ICloneable< out T > Loyc.Collections.ICount Loyc.Collections.IIsEmpty Loyc.Collections.IAddRange< T > Loyc.Collections.ISinkCollection< T > Loyc.Collections.ICollectionAndReadOnly< T > Loyc.Collections.INotifyListChanging< T > Loyc.Collections.IListSource< out T > Loyc.Collections.INotifyListChanging< T > Loyc.Collections.IListSource< out T >

Remarks

An sorted dictionary that is efficient for all operations and offers indexed access to its list of key-value pairs.

An article about the BList classes is available.

The keys must be comparable (ordered); if the type does not implement IComparable or IComparable(T), you must provide a Comparison(T) delegate to perform comparisons.

This class offers the following additional features beyond what's offered by the standard SortedDictionary{T} class: indexed access, a find-nearest- key operation called FindLowerBound (similar to lower_bound in C++), observability, fast cloning, freezability, fast cloning of an arbitrary range of items in a large collection, enumeration of part of the list (not just the entire list), and reverse enumeration, and a few compound operations.

Duplicate keys are not allowed in a BDictionary. If you would like to be able to associate multiple values with a single key, use BMultiMap{K,V} instead.

If you need to store only keys, not values, use BList{K} instead (but note that BList does allow duplicate keys).

Properties

ICollection< K > Keys [get]
 
ICollection< V > Values [get]
 
this[K key] [get, set]
 
this[K key, V defaultValue] [get]
 
- Properties inherited from Loyc.Collections.AListBase< K, T >
virtual ListChangingHandler< T > ListChanging
 Event for learning about changes in progress on a list. More...
 
byte TreeHeight [get]
 
int Count [get]
 
bool IsEmpty [get]
 
AListReverseView< K, T > ReverseView [get]
 
this[int index] [get]
 
bool IsFrozen [get]
 
First [get]
 
Last [get]
 
int ObserverCount [get]
 Returns the number of tree observers attached to this list. More...
 
- Properties inherited from Loyc.Collections.ICount
int Count [get]
 Gets the number of items in the collection. More...
 
- Properties inherited from Loyc.Collections.IIsEmpty
bool IsEmpty [get]
 

Public Member Functions

 BDictionary ()
 Initializes an empty BList. More...
 
 BDictionary (int maxLeafSize)
 
 BDictionary (int maxLeafSize, int maxInnerSize)
 
 BDictionary (Func< K, K, int > compareKeys)
 
 BDictionary (Func< K, K, int > compareKeys, int maxLeafSize)
 
 BDictionary (Func< K, K, int > compareKeys, int maxLeafSize, int maxInnerSize)
 Initializes an empty BDictionary. More...
 
 BDictionary (BDictionary< K, V > items, bool keepListChangingHandlers)
 
void Add (KeyValuePair< K, V > item)
 
int IndexOf (KeyValuePair< K, V > item)
 
bool Contains (KeyValuePair< K, V > item)
 
bool Remove (KeyValuePair< K, V > item)
 
int FindLowerBound (K key)
 Finds the lowest index of an item with a key that is equal to or greater than the specified key. More...
 
int FindLowerBound (K key, out bool found)
 
int FindLowerBound (ref K key)
 
int FindLowerBound (ref K key, out bool found)
 
int IndexOf (K key)
 
int FindUpperBound (K key)
 Finds the index of the first item in the list that is greater than the specified item. More...
 
int FindUpperBound (ref K key)
 
void AddRange (IEnumerable< KeyValuePair< K, V >> e)
 
int RemoveRange (IEnumerable< KeyValuePair< K, V >> e)
 
int RemoveRange (IEnumerable< K > e)
 
void Add (K key, V value)
 
bool ContainsKey (K key)
 
bool Remove (K key)
 
bool TryGetValue (K key, out V value)
 
BDictionary< K, V > Clone ()
 
BDictionary< K, V > Clone (bool keepListChangingHandlers)
 Clones a BDictionary. More...
 
BDictionary< K, V > CopySection (int start, int subcount)
 
BDictionary< K, V > RemoveSection (int start, int count)
 
bool AddIfNotPresent (K key, V value)
 Adds the specified pair only if the key is not already present in the dictionary. More...
 
bool AddIfNotPresent (K key, ref V value)
 
bool AddIfNotPresent (ref K key, ref V value)
 
bool SetAndGetOldValue (K key, ref V value)
 Associates the specified value with the specified key, while getting the old value if one exists. More...
 
bool SetAndGetOldValue (ref K key, ref V value)
 
bool ReplaceIfPresent (K key, V value)
 Replaces the value associated with a specified key, if it already exists in the dictionary. More...
 
bool ReplaceIfPresent (K key, ref V value)
 
bool ReplaceIfPresent (ref K key, ref V value)
 
- Public Member Functions inherited from Loyc.Collections.AListBase< K, T >
void RemoveAt (int index)
 
void RemoveRange (int index, int amount)
 
int RemoveAll (Predicate< T > match)
 Removes all the elements that match the conditions defined by the specified predicate. More...
 
virtual void Clear ()
 
IEnumerable< int > IndexesOf (T item)
 Returns a sequence of integers that represent the locations where a given item appears in the list. More...
 
virtual IEnumerable< int > IndexesOf (T item, int minIndex, int maxIndex)
 
int LinearScanFor (T item, int startIndex, EqualityComparer< T > comparer)
 Scans the list starting at startIndex and going upward, and returns the index of an item that matches the first argument. More...
 
void CopyTo (T[] array, int arrayIndex)
 
Enumerator GetEnumerator ()
 
Enumerator GetEnumerator (int startIndex)
 
Enumerator GetEnumerator (int start, int subcount)
 
Enumerator GetEnumerator (int start, int subcount, bool startAtEnd)
 
TryGet (int index, out bool fail)
 Gets the item at the specified index, and does not throw an exception on failure. More...
 
virtual void Freeze ()
 Prevents further changes to the list. More...
 
Slice_< T > Slice (int start, int length)
 Returns a sub-range of this list. More...
 
int GetImmutableCount ()
 Diagnostic method. Returns the number of elements of the list that are located in immutable nodes, which will be copied if modified. Used by the test suite. More...
 
virtual bool AddObserver (IAListTreeObserver< K, T > observer)
 Attaches a tree observer to this object. More...
 
virtual bool RemoveObserver (IAListTreeObserver< K, T > observer)
 Removes a previously attached tree observer from this list. More...
 
- Public Member Functions inherited from Loyc.Collections.ICollectionEx< T >
int RemoveAll (Predicate< T > match)
 Removes the all the elements that match the conditions defined by the specified predicate. More...
 
- Public Member Functions inherited from Loyc.Collections.ISinkCollection< T >
void Clear ()
 
bool Remove (T item)
 
- Public Member Functions inherited from Loyc.Collections.IAdd< in T >
void Add (T item)
 
- Public Member Functions inherited from Loyc.Collections.IAddRange< T >
void AddRange (IEnumerable< T > e)
 
void AddRange (IReadOnlyCollection< T > s)
 

Protected Member Functions

 BDictionary (BDictionary< K, V > original, AListNode< K, KeyValuePair< K, V >> section)
 
override AListNode< K,
KeyValuePair< K, V > > 
NewRootLeaf ()
 
override AListInnerBase< K,
KeyValuePair< K, V > > 
SplitRoot (AListNode< K, KeyValuePair< K, V >> left, AListNode< K, KeyValuePair< K, V >> right)
 
int CompareToKey (KeyValuePair< K, V > item, K key)
 
- Protected Member Functions inherited from Loyc.Collections.AListBase< K, T >
 AListBase (int maxLeafSize)
 
 AListBase (int maxLeafSize, int maxInnerSize)
 
 AListBase (AListBase< K, T > items, bool keepListChangingHandlers)
 Cloning constructor. Does not duplicate the observer (IAListTreeObserver{K,T}), if any, because it may not be cloneable. More...
 
 AListBase (AListBase< K, T > original, AListNode< K, T > section)
 This is the constructor that CopySection(), which can be defined by derived classes, should call to create a sublist of a list. Used in conjunction with CopySectionHelper(). More...
 
abstract AListInnerBase< K, T > SplitRoot (AListNode< K, T > left, AListNode< K, T > right)
 
virtual Enumerator NewEnumerator (uint start, uint firstIndex, uint lastIndex)
 
void CheckPoint ()
 
void AutoThrow ()
 
void AutoCreateOrCloneRoot ()
 
void AutoSplit (AListNode< K, T > splitLeft, AListNode< K, T > splitRight)
 
void HandleChangedOrUndersizedRoot (AListNode< K, T > result)
 
virtual void ClearInternal (bool forceClear)
 Clears the tree. More...
 
AListNode< K, T > CopySectionHelper (int start, int subcount)
 Together with the AListBase{K,T}.AListBase(AListBase{K,T},AListNode{K,T}) constructor, this method helps implement the CopySection() method in derived classes, by cloning a section of the tree. More...
 
AListNode< K, T > CopySectionHelper (uint start, uint subcount)
 
void SwapHelper (AListBase< K, T > other, bool swapObservers)
 Swaps two ALists. More...
 

Protected fields

Func< K, K, int > _compareKeys
 
- Protected fields inherited from Loyc.Collections.AListBase< K, T >
uint _count
 
ushort _version
 
ushort _maxLeafSize
 
byte _maxInnerSize
 
byte _treeHeight
 
byte _freezeMode = NotFrozen
 
const byte NotFrozen = 0
 
const byte Frozen = 1
 
const byte FrozenForListChanging = 2
 
const byte FrozenForConcurrency = 3
 

Protected static fields

static readonly Func< K, K, int > DefaultComparison = Comparer<K>.Default.Compare
 

Additional Inherited Members

- Events inherited from Loyc.Collections.INotifyListChanging< T >
ListChangingHandler< T > ListChanging
 Occurs when the collection associated with this interface is about to change. More...
 

Constructor & Destructor Documentation

Loyc.Collections.BDictionary< K, V >.BDictionary ( )
inline

Initializes an empty BList.

By default, elements of the list will be compared using Comparer{T}.Default.Compare.

Loyc.Collections.BDictionary< K, V >.BDictionary ( Func< K, K, int >  compareKeys,
int  maxLeafSize,
int  maxInnerSize 
)
inline

Initializes an empty BDictionary.

Parameters
compareKeysA method that compares two items and returns a negative number (typically -1) if the first item is smaller than the second item, 0 if it is equal, and a positive number (typically 1) if it is greater.
maxLeafSizeMaximum number of elements to place in a leaf node of the B+ tree.
maxInnerSizeMaximum number of elements to place in an inner node of the B+ tree.

If present, the compareKeys parameter must be a "Func" delegate instead of the more conventional Comparison{T} delegate for an obscure design decision for the benefit of BList{T}. You should not notice any difference between the two, but the stupid .NET type system insists that the two types are not compatible. So, if (for some reason) you already happen to have a Comparison{K} delegate, you must explicitly convert it to a Func delegate with code such as "new Func&lt;K,K,int>(comparisonDelegate)".

If you leave out the compareKeys parameter, Comparer{K}.Default.Compare will be used by default.

See the documentation of AListBase{K,T} for a discussion about node sizes.

An empty BDictionary is created with no root node, so it consumes much less memory than a BDictionary with a single element.

Loyc.Collections.BDictionary< K, V >.BDictionary ( BDictionary< K, V >  items,
bool  keepListChangingHandlers 
)
inline
Parameters
itemsA list of items to be cloned.

Member Function Documentation

bool Loyc.Collections.BDictionary< K, V >.AddIfNotPresent ( key,
value 
)
inline

Adds the specified pair only if the key is not already present in the dictionary.

Parameters
keyKey to search for or add. If this parameter is passed by reference and a matching pair exists already, this method sets it to the existing key instance.
valueValue to search for or add. If this parameter is passed by reference and a matching pair exists already, this method sets it to the existing value.
Returns
True if the new pair was added, false if not.

This method has no effect if the key is already present.

BDictionary<K, V> Loyc.Collections.BDictionary< K, V >.Clone ( bool  keepListChangingHandlers)
inline

Clones a BDictionary.

Parameters
keepListChangingHandlersIf true, ListChanging handlers will be copied from the existing list of items to the new collection. Note: if it exists, the NodeObserver is never copied. AListBase{K,T}.ObserverCount will be 0 in the new list.

Cloning is performed in O(1) time by marking the tree root as frozen and sharing it between the two lists. However, the new dictionary itself will not be frozen, even if the original dictionary was marked as frozen. Instead, nodes will be copied on demand when you modify the new dictionary.

int Loyc.Collections.BDictionary< K, V >.FindLowerBound ( key)
inline

Finds the lowest index of an item with a key that is equal to or greater than the specified key.

Parameters
keyThe key to find. If passed by reference, when this method returns, key is set to the key of the item that was found, or to the next greater item if the item was not found. If the item passed in is higher than all items in the list, it will be left unchanged when this method returns.
foundSet to true if the item was found, false if not.
Returns
The index of the item that was found, or of the next greater item, or Count if the given item is greater than all items in the list.
int Loyc.Collections.BDictionary< K, V >.FindUpperBound ( key)
inline

Finds the index of the first item in the list that is greater than the specified item.

Parameters
keyThe item to find. If passed by reference, when this method returns, item is set to the next greater item than the item you searched for, or left unchanged if there is no greater item.
Returns
The index of the next greater item that was found, or Count if the given item is greater than all items in the list.
bool Loyc.Collections.BDictionary< K, V >.ReplaceIfPresent ( key,
value 
)
inline

Replaces the value associated with a specified key, if it already exists in the dictionary.

Parameters
keyKey to replace. If this parameter is passed by reference and a matching pair existed, this method sets it to the old key instance.
valueNew value to associate with the key. If this parameter is passed by reference and a matching pair existed, this method sets it to the old value.
Returns
True if the key was found and the pair was replaced, false if it was not found.

This method has no effect if the key was not already present.

bool Loyc.Collections.BDictionary< K, V >.SetAndGetOldValue ( key,
ref V  value 
)
inline

Associates the specified value with the specified key, while getting the old value if one exists.

Parameters
keyKey to search for or add. If this parameter is passed by reference and a matching pair existed already, this method sets it to the old key instance.
valueValue to search for or add. If this parameter is passed by reference and a matching pair existed already, this method sets it to the old value.
Returns
True if the new pair was added, false if it was replaced.