public void Add(KeyValuePair <TKey, TValue> pair)
        {
            BPlusTreeNode <TKey, TValue> current = FindLeafThatMightContainKey(pair.Key);

            if (current != null)
            {
                if (current.Values.ContainsKey(pair.Key))
                {
                    throw new ArgumentException("An entry with the same key already exists.");
                }


                if (current.Values.Last().Key.CompareTo(pair.Key) < 0 && current.ParentNode != null)
                {
                    TKey oldKey = current.Values.Keys.Last();
                    current.Values.Add(pair.Key, pair.Value);

                    current.ParentNode.Links.Remove(oldKey);
                    current.ParentNode.Links.Add(pair.Key, current);

                    BPlusTreeNode <TKey, TValue> parent = current.ParentNode;

                    while (parent.ParentNode != null)
                    {
                        parent.ParentNode.Links.Remove(oldKey);
                        parent.ParentNode.Links.Add(pair.Key, parent);

                        parent = parent.ParentNode;
                    }
                }
                else
                {
                    current.Values.Add(pair.Key, pair.Value);
                }

                if (current.KeysCount > MaxDegree)
                {
                    Split(current);
                }
            }
            else
            {
                BPlusTreeNodeSortedValues <TKey, TValue> list = new BPlusTreeNodeSortedValues <TKey, TValue>();
                list.Add(pair.Key, pair.Value);
                Head = new BPlusTreeNode <TKey, TValue>(list, null, null, null, this, true);

                NodesCount++;
            }

            Count++;
        }
 public void CopyTo(BPlusTreeNodeSortedValues <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 BPlusTreeNodeSortedValues.");
     }
 }
        protected void PullLeaves(BPlusTreeNode <TKey, TValue> leafToPull, BPlusTreeNode <TKey, TValue> leafFromPull)
        {
            int numberOfValuesToPull = leafToPull.KeysCount + (leafFromPull.KeysCount - leafToPull.KeysCount) / 2;

            if (leafToPull.RightLeafNode == leafFromPull)
            {
                BPlusTreeNodeSortedValues <TKey, TValue> pulledValues = new BPlusTreeNodeSortedValues <TKey, TValue>();

                for (int i = 0; i < numberOfValuesToPull; i++)
                {
                    pulledValues.Add(leafFromPull.Values.Keys[0], leafFromPull.Values.Values[0]);
                    leafFromPull.Values.RemoveAt(0);
                }

                TKey oldKey = leafToPull.Values.Keys.Max();

                leafToPull.Values.AddRange(pulledValues);

                leafToPull.ParentNode.Links.Remove(oldKey);
                leafToPull.ParentNode.Links.Add(leafToPull.Values.Keys.Max(), leafToPull);
            }
            else
            {
                BPlusTreeNodeSortedValues <TKey, TValue> pulledValues = new BPlusTreeNodeSortedValues <TKey, TValue>();

                TKey oldKey = leafFromPull.Values.Keys.Max();

                for (int i = 0; i < numberOfValuesToPull; i++)
                {
                    pulledValues.Add(leafFromPull.Values.Keys[leafFromPull.KeysCount - 1],
                                     leafFromPull.Values.Values[leafFromPull.KeysCount - 1]);
                    leafFromPull.Values.RemoveAt(leafFromPull.KeysCount - 1);
                }

                leafToPull.Values.AddRange(pulledValues);

                leafFromPull.ParentNode.Links.Remove(oldKey);
                leafFromPull.ParentNode.Links.Add(leafFromPull.Values.Keys.Max(), leafFromPull);
            }
        }