/// <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); }
/// <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)); }