An sorted in-memory list that is efficient for all operations and offers indexed access to its list.
More...
An sorted in-memory list that is efficient for all operations and offers indexed access to its list.
An article about the BList classes is available.
When you need a sorted list of items, there's nothing quite like a BList. BList offers numerous features that none of the standard .NET collections can offer:
-
O(log N) efficiency for all standard list operations (Add, Remove, IndexOf, this[]) plus and O(1) fast cloning and O(1)-per-element enumeration.
-
Changes can be observed through the AListBase{K,T}.ListChanging event. The performance penalty for this feature is lower than for the standard ObservableCollection{T} class.
-
Changes to the tree structure can be observed too (see IAListTreeObserver{K,T}).
-
The list can be frozen with AListBase{K,T}.Freeze, making it read-only.
-
FindLowerBound and FindUpperBound operations that find the nearest item equal to or greater than a specified item.
-
A reversed view of the list is available through the AListBase{K,T}.ReverseView property, and the list can be enumerated backwards, also in O(1) time per element..
-
A BList normally uses less memory than a SortedDictionary{K,V} or a hashtable such as HashSet{T} or Dictionary{K,V}.
-
Other features inherited from AListBase{T}
Please note, however, that BList{T} is generally slower than Dictionary{K,V} and HashSet{T}, so you should only use it when you need a sorted list of items, or when you need its special features such as FindLowerBound or observability.
Caution: items must not be modified in a way that affects their sort order after they are added to the list. If the list ever stops being sorted, it will malfunction, as it will no longer be possible to find some of the items.
|
| BList () |
| Initializes an empty BList. More...
|
|
| BList (int maxLeafSize) |
|
| BList (int maxLeafSize, int maxInnerSize) |
|
| BList (Func< T, T, int > compareItems) |
|
| BList (Func< T, T, int > compareItems, int maxLeafSize) |
|
| BList (Func< T, T, int > compareItems, int maxLeafSize, int maxInnerSize) |
| Initializes an empty BList. More...
|
|
| BList (BList< T > items, bool keepListChangingHandlers) |
|
void | Add (T item) |
|
bool | Remove (T item) |
| Removes a single instance of the specified item. More...
|
|
int | RemoveAll (T item) |
| Removes all instances of the specified item. More...
|
|
int | Do (AListOperation mode, ref T item) |
| Adds, removes, or replaces an item in the list. More...
|
|
int | Do (AListOperation mode, T item) |
|
int | AddRange (IEnumerable< T > e) |
| Adds a set of items to the list, one at a time. More...
|
|
int | RemoveRange (IEnumerable< T > e) |
| Removes a set of items from the list, one at a time. More...
|
|
int | DoRange (AListOperation mode, IEnumerable< T > e) |
| Performs the same operation for each item in a series. Equivalent to calling Do(AListOperation,T) on each item. More...
|
|
BList< T > | Clone () |
|
BList< T > | Clone (bool keepListChangingHandlers) |
| Clones a BList. More...
|
|
BList< T > | CopySection (int start, int subcount) |
|
BList< T > | RemoveSection (int start, int count) |
|
int | IndexOf (T item) |
| Finds the lowest index of an item that is equal to or greater than the specified item. More...
|
|
bool | Contains (T item) |
| Returns true if the list contains the specified item, and false if not. More...
|
|
int | FindLowerBound (T item) |
| Finds the lowest index of an item that is equal to or greater than the specified item. More...
|
|
int | FindLowerBound (T item, out bool found) |
|
int | FindLowerBound (ref T item) |
|
int | FindLowerBound (ref T item, out bool found) |
|
int | FindUpperBound (T item) |
| Finds the index of the first item in the list that is greater than the specified item. More...
|
|
int | FindUpperBound (ref T item) |
|
int | IndexOfExact (T item) |
| Specialized search function that finds the index of an item that not only compares equal to the specified item according to the comparison function for this collection, but is also equal according to Object.Equals. This function works properly even if duplicate items exist in addition that do NOT compare equal according to Object.Equals. More...
|
|
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) |
|
T | 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...
|
|
int | RemoveAll (Predicate< T > match) |
| Removes the all the elements that match the conditions defined by the specified predicate. More...
|
|
void | Clear () |
|
|
| BList (BList< T > original, AListNode< T, T > section) |
|
override AListNode< T, T > | NewRootLeaf () |
|
override AListInnerBase< T, T > | SplitRoot (AListNode< T, T > left, AListNode< T, T > right) |
|
| 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...
|
|
Loyc.Collections.BList< T >.BList |
( |
Func< T, T, int > |
compareItems, |
|
|
int |
maxLeafSize, |
|
|
int |
maxInnerSize |
|
) |
| |
|
inline |
Initializes an empty BList.
- Parameters
-
compareItems | A method that compares two items and returns -1 if the first item is smaller than the second item, 0 if it is equal, and 1 if it is greater. |
maxLeafSize | Maximum number of elements to place in a leaf node of the B+ tree. |
maxInnerSize | Maximum 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 technical reason (specifically, it is the type required by AListSingleOperation{K,T}.CompareToKey). 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{T} delegate, you must explicitly convert it to a Func delegate with code such as "new Func<T,T,int>(comparisonDelegate)".
If you leave out the compareKeys parameter, Comparer{T}.Default.Compare will be used by default.
See the documentation of AListBase{K,T} for a discussion about node sizes.
An empty BList is created with no root node, so it consumes much less memory than a BList with a single element.