RankedBagT Class |
Namespace: Kaos.Collections
[SerializableAttribute] public class RankedBag<T> : Btree<T>, ICollection<T>, IEnumerable<T>, IEnumerable, ICollection, IReadOnlyCollection<T>, ISerializable, IDeserializationCallback
The RankedBagT type exposes the following members.
Name | Description | |
---|---|---|
RankedBagT | Initializes a new bag instance that uses the default comparer. | |
RankedBagT(IComparerT) | Initializes a new bag instance that uses the supplied comparer. | |
RankedBagT(IEnumerableT) | Initializes a new bag instance that contains items copied from the supplied collection. | |
RankedBagT(IEnumerableT, IComparerT) | Initializes a new bag instance that contains items copied from the supplied collection. | |
RankedBagT(SerializationInfo, StreamingContext) | Initializes a new bag instance that contains serialized data. |
Name | Description | |
---|---|---|
Capacity | Gets or sets the order of the underlying B+ tree structure. (Inherited from BtreeT.) | |
Comparer | Returns a wrapper of the method used to order items in the bag. | |
Count | Gets the total number of occurrences of all items in the bag. | |
Max | Gets the maximum item in the bag per the comparer. | |
Min | Gets the minimum item in the bag per the comparer. |
Name | Description | |
---|---|---|
Add(T) | Adds an item to the bag. | |
Add(T, Int32) | Adds a supplied number of occurrences of the supplied item to the bag. | |
Clear | Removes all items from the bag. | |
Contains | Determines whether the bag contains the supplied item. | |
ContainsAll | Determines whether the bag is a subset of the supplied collection. | |
CopyTo(T) | Copies the items to a compatible array. | |
CopyTo(T, Int32) | Copies the items to a compatible array, starting at the supplied position. | |
CopyTo(T, Int32, Int32) | Copies a supplied number of items to a compatible array, starting at the supplied position. | |
Distinct | Returns an enumerator that iterates thru the distinct items of the bag in sort order. | |
ElementAt | Gets the item at the supplied index. | |
ElementAtOrDefault | Gets the item at the supplied index or the default if the index is out of range. | |
ElementsBetween | Returns an enumerator that iterates over a range with the supplied bounds. | |
ElementsBetweenIndexes | Returns an enumerator that iterates over a range with the supplied index bounds. | |
ElementsFrom | Returns an enumerator that iterates over a range with the supplied lower bound. | |
Equals | Determines whether the specified object is equal to the current object. (Inherited from Object.) | |
Finalize | Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.) | |
First | Gets the minimum item in the bag per the comparer. | |
GetCount | Returns the number of occurrences of the supplied item in the bag. | |
GetDistinctCount | Returns the number of distinct items in the bag. | |
GetEnumerator | Returns an enumerator that iterates thru the bag. | |
GetHashCode | Serves as the default hash function. (Inherited from Object.) | |
GetObjectData | Returns the data needed to serialize the bag. | |
GetType | Gets the Type of the current instance. (Inherited from Object.) | |
IndexOf | Gets the index of the first occurrence of the supplied item. | |
Last | Gets the maximum item in the bag per the comparer. | |
MemberwiseClone | Creates a shallow copy of the current Object. (Inherited from Object.) | |
OnDeserialization | Implements the deserialization callback and raises the deserialization event when completed. | |
Remove(T) | Removes all occurrences of the supplied item from the bag. | |
Remove(T, Int32) | Removes a supplied number of occurrences of the supplied item from the bag. | |
RemoveAll |
Removes all items in the supplied collection from the bag.
| |
RemoveAt | Removes the element at the supplied index from the bag. | |
RemoveRange | Removes an index range of items from the bag. | |
RemoveWhere | Removes all elements that match the condition defined by the supplied predicate from the bag. | |
RetainAll | Removes any elements that are not in the supplied collection from the bag. | |
Reverse | Returns an IEnumerable that iterates thru the bag in reverse sort order. | |
Skip | Bypasses a supplied number of items and yields the remaining items. | |
SkipWhile(FuncT, Boolean) |
Bypasses items as long as a supplied condition is true and yields the remaining items.
| |
SkipWhile(FuncT, Int32, Boolean) |
Bypasses elements as long as a supplied index-based condition is true and yields the remaining items.
| |
ToString | Returns a string that represents the current object. (Inherited from Object.) | |
TryGet | Gets the actual item for the supplied search item. | |
TryGetGreaterThan | Gets the least item greater than the supplied item. | |
TryGetGreaterThanOrEqual | Gets the least item greater than or equal to the supplied item. | |
TryGetLessThan | Gets the greatest item that is less than the supplied item. | |
TryGetLessThanOrEqual | Gets the greatest item that is less than or equal to the supplied item. |
Name | Description | |
---|---|---|
ICollectionTAdd | Adds an item to the bag. | |
ICollectionCopyTo | Copies the bag to a compatible array, starting at the supplied array index. | |
IEnumerableTGetEnumerator | Returns an enumerator that iterates thru the bag. | |
IEnumerableGetEnumerator | Returns an enumerator that iterates thru the collection. | |
ISerializableGetObjectData | Returns the data needed to serialize the set. | |
ICollectionTIsReadOnly | Indicates that the collection is not read-only. | |
ICollectionIsSynchronized | Indicates that the collection is not thread safe. | |
IDeserializationCallbackOnDeserialization | Implements the deserialization callback and raises the deserialization event when completed. | |
ICollectionSyncRoot | Gets an object that can be used to synchronize access to the collection. |
This class is similar to RankedSetT but with multiple occurrences of an item allowed. Items with multiple occurrences have each occurrence stored individually. This flattened implementation prevents any loss of information that might occur if only a count of occurrences for a key were maintained.
The first program shows some basic operations of this class.
using System; using Kaos.Collections; namespace ExampleApp { class RbExample01 { static void Main() { var crayons = new RankedBag<string> (StringComparer.InvariantCultureIgnoreCase) { "red", "yellow", "black", "BLACK" }; crayons.Add ("blue"); Console.WriteLine ($"There are {crayons.Count} total crayons:"); foreach (var crayon in crayons) Console.WriteLine ($" {crayon}"); Console.WriteLine ($"\nThere are {crayons.GetDistinctCount()} distinct colors:"); foreach (var crayon in crayons.Distinct()) Console.WriteLine ($" {crayon}"); Console.WriteLine ($"\nGot 'gold' crayon? {crayons.Contains ("gold")}"); // RetainAll respects cardinality so the oldest 'black' is removed: crayons.RetainAll (new string[] { "white", "grey", "Black", "red" }); Console.WriteLine ("\nAfter RetainAll: "); foreach (var crayon in crayons) Console.WriteLine ($" {crayon}"); } /* Output: There are 5 total crayons: black BLACK blue red yellow There are 4 distinct colors: black blue red yellow Got 'gold' crayon? False After RetainAll: BLACK red */ } }
using System; using Kaos.Collections; namespace ExampleApp { public class CharMap : IComparable<CharMap> { public char Ch { get; private set; } public int Pos { get; private set; } public CharMap (char ch, int pos) { Ch = ch; Pos = pos; } public int CompareTo (CharMap other) => Ch.CompareTo (other.Ch); public override string ToString() => Ch + " :: " + Pos; } class RbExample02 { static void Main() { var map = new RankedBag<CharMap>(); string s1 = "this is it"; for (int pos = 0; pos < s1.Length; ++pos) if (! Char.IsWhiteSpace (s1[pos])) map.Add (new CharMap (s1[pos], pos)); foreach (var mapItem in map) Console.WriteLine (mapItem); } /* Output: h :: 1 i :: 2 i :: 5 i :: 8 s :: 3 s :: 6 t :: 0 t :: 9 */ } }
Last is an example showing binary serialization round tripped.
Note: Serialization is not supported in .NET Standard 1.0.
using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using Kaos.Collections; namespace ExampleApp { [Serializable] public class ExamComparer : Comparer<Exam> { public override int Compare (Exam x1, Exam x2) => x1.Score - x2.Score; } [Serializable] public class Exam : ISerializable { public int Score { get; private set; } public string Name { get; private set; } public Exam (int score, string name) { this.Score = score; this.Name = name; } protected Exam (SerializationInfo info, StreamingContext context) { this.Score = (int) info.GetValue ("Score", typeof (int)); this.Name = (string) info.GetValue ("Name", typeof (string)); } public virtual void GetObjectData (SerializationInfo info, StreamingContext context) { info.AddValue ("Score", Score, typeof (int)); info.AddValue ("Name", Name, typeof (string)); } public override string ToString() => Score + ", " + Name; } class RbExample05 { static void Main() { var bag1 = new RankedBag<Exam> (new ExamComparer()); bag1.Add (new Exam (5, "Jack")); bag1.Add (new Exam (2, "Ned")); bag1.Add (new Exam (2, "Betty")); bag1.Add (new Exam (3, "Paul")); bag1.Add (new Exam (5, "John")); Console.WriteLine ("Items are inserted after other items that compare equally:"); foreach (var item in bag1) Console.WriteLine ($" {item}"); string fileName = "Exams.bin"; IFormatter formatter = new BinaryFormatter(); SerializeExams (fileName, bag1, formatter); Console.WriteLine ($"\nWrote {bag1.Count} items to file '{fileName}'."); Console.WriteLine (); RankedBag<Exam> bag2 = DeserializeExams (fileName, formatter); Console.WriteLine ($"Read back {bag2.Count} items:"); foreach (var p2 in bag2) Console.WriteLine ($" {p2}"); } static void SerializeExams (string fn, RankedBag<Exam> bag, IFormatter formatter) { using (var fs = new FileStream (fn, FileMode.Create)) { formatter.Serialize (fs, bag); } } static RankedBag<Exam> DeserializeExams (string fn, IFormatter formatter) { using (var fs = new FileStream (fn, FileMode.Open)) { return (RankedBag<Exam>) formatter.Deserialize (fs); } } /* Output: Items are inserted after other items that compare equally: 2, Ned 2, Betty 3, Paul 5, Jack 5, John Wrote 5 items to file 'Exams.bin'. Read back 5 items: 2, Ned 2, Betty 3, Paul 5, Jack 5, John */ } }