public void CopyTo(BPlusTreeNodeSortedLinks <TKey, TValue> links, int copyFromIndex, int copyToIndex) { try { for (int i = copyFromIndex; i < copyToIndex; i++) { links.Add(this.Keys[i], this.Values[i]); } } catch (Exception) { throw new IndexOutOfRangeException("Index run out of range while coping BPlusTreeNodeSortedLinks."); } }
protected void PullNodes(BPlusTreeNode <TKey, TValue> nodeToPull, BPlusTreeNode <TKey, TValue> nodeFromPull) { int numberOfLinksToPull = nodeToPull.KeysCount + (nodeFromPull.KeysCount - nodeToPull.KeysCount) / 2; if (nodeToPull.RightNode == nodeFromPull) { BPlusTreeNodeSortedLinks <TKey, TValue> pulledLinks = new BPlusTreeNodeSortedLinks <TKey, TValue>(); for (int i = 0; i < numberOfLinksToPull; i++) { pulledLinks.Add(nodeFromPull.Links.Keys[0], nodeFromPull.Links.Values[0]); nodeFromPull.Links.RemoveAt(0); } TKey oldKey = nodeToPull.Links.Keys.Max(); nodeToPull.Links.AddRange(nodeToPull, pulledLinks); nodeToPull.ParentNode.Links.Remove(oldKey); nodeToPull.ParentNode.Links.Add(nodeToPull.Links.Keys.Max(), nodeToPull); } else { BPlusTreeNodeSortedLinks <TKey, TValue> pulledLinks = new BPlusTreeNodeSortedLinks <TKey, TValue>(); TKey oldKey = nodeFromPull.Links.Keys.Max(); for (int i = 0; i < numberOfLinksToPull; i++) { pulledLinks.Add(nodeFromPull.Links.Keys[nodeFromPull.KeysCount - 1], nodeFromPull.Links.Values[nodeFromPull.KeysCount - 1]); nodeFromPull.Links.RemoveAt(nodeFromPull.KeysCount - 1); } nodeToPull.Links.AddRange(nodeToPull, pulledLinks); nodeFromPull.ParentNode.Links.Remove(oldKey); nodeFromPull.ParentNode.Links.Add(nodeFromPull.Links.Keys.Max(), nodeFromPull); } }