Ejemplo n.º 1
0
        /// <summary>
        /// Deletes the nodes found within the provided range.
        /// </summary>
        /// <param name="range">
        /// The range.
        /// </param>
        /// <param name="dictionary">
        /// The dictionary containing the map of element to score. Any deleted
        /// elements will be deleted from the dictionary.
        /// </param>
        /// <returns>
        /// The number of deleted nodes.
        /// </returns>
        public long DeleteRangeByScore(SkipListRange range, IDictionary <string, double> dictionary)
        {
            var update = new SkipListNode[SkipListMaxLevel];

            long removed = 0;

            var currentNode = Head;

            for (var currentLevel = Levels - 1; currentLevel >= 0; currentLevel--)
            {
                while (currentNode.Levels[currentLevel].Forward != null &&
                       (range.IsMinExclusive
                           ? currentNode.Levels[currentLevel].Forward.Score <= range.Min
                           : currentNode.Levels[currentLevel].Forward.Score < range.Min))
                {
                    currentNode = currentNode.Levels[currentLevel].Forward;
                }

                update[currentLevel] = currentNode;
            }

            /* Current node is the last with score < or <= min. */
            currentNode = currentNode.Levels[0].Forward;

            /* Delete nodes while in range. */
            while (currentNode != null &&
                   (range.IsMaxExclusive
                       ? currentNode.Score < range.Max
                       : currentNode.Score <= range.Max))
            {
                var next = currentNode.Levels[0].Forward;

                DeleteNode(currentNode, update);

                dictionary?.Remove(currentNode.Element);

                removed++;

                currentNode = next;
            }

            return(removed);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Deletes nodes found within the provided range.
 /// </summary>
 /// <param name="range">
 /// The range.
 /// </param>
 /// <returns>
 /// The number of deleted nodes.
 /// </returns>
 public long DeleteRangeByScore(SkipListRange range)
 {
     return(DeleteRangeByScore(range, null));
 }