public override void Foreach(Action <TK, TV> action)
        {
            SkipNode <TK, TV> x = _header;

            while (x.Forward[0] != null)
            {
                action(x.Key, x.Value);
            }
        }
        public override bool Contains(TK key)
        {
            SkipNode <TK, TV> x = _header;

            for (int i = MaxLevel; i >= 0; i--)
            {
                while (x.Forward[i] != null && x.Forward[i].Key.CompareTo(key) < 0)
                {
                    x = x.Forward[i];
                }
            }
            x = x.Forward[0];
            return(x != null && x.Key.CompareTo(key) == 0);
        }
        protected override TV Get(TK key)
        {
            SkipNode <TK, TV> x = _header;

            for (int i = _level; i >= 0; i--)
            {
                while (x.Forward[i] != null && x.Forward[i].Key.CompareTo(key) < 0)
                {
                    x = x.Forward[i];
                }
            }
            if (x.Forward[0].Key.CompareTo(key) == 0)
            {
                return(x.Forward[0].Value);
            }
            else
            {
                throw new ArgumentException("The Key was not found");
            }
        }
        protected override bool Put(TK key, TV value)
        {
            SkipNode <TK, TV> x = _header;

            SkipNode <TK, TV>[] update = new SkipNode <TK, TV> [MaxLevel + 1];
            for (int i = _level; i >= 0; i--)
            {
                while (x.Forward[i] != null && x.Forward[i].Key.CompareTo(key) < 0)
                {
                    x = x.Forward[i];
                }
                update[i] = x;
            }
            x = x.Forward[0];
            if (x == null || x.Key.CompareTo(key) != 0)
            {
                int lvl = MathHelper.RandomLevel(MaxLevel);
                if (lvl > _level)
                {
                    for (int i = _level + 1; i <= lvl; i++)
                    {
                        update[i] = _header;
                    }
                    _level = lvl;
                }
                x = new SkipNode <TK, TV>(lvl, key, value);
                _size++;
                for (int i = 0; i <= lvl; i++)
                {
                    x.Forward[i]         = update[i].Forward[i];
                    update[i].Forward[i] = x;
                }
            }
            if (x.Key.CompareTo(key) == 0)
            {
                x.Value = value;
            }
            return(true);
        }
        public override TV Remove(TK key)
        {
            SkipNode <TK, TV> x = _header;

            SkipNode <TK, TV>[] updateNode = new SkipNode <TK, TV> [MaxLevel + 1];
            for (int i = _level; i >= 0; i--)
            {
                while (x.Forward[i] != null && x.Forward[i].Key.CompareTo(key) < 0)
                {
                    x = x.Forward[i];
                }
                updateNode[i] = x;
            }
            x = x.Forward[0];
            if (x.Key.CompareTo(key) == 0)
            {
                for (int i = 0; i <= _level; i++)
                {
                    if (updateNode[i].Forward[i] != x)
                    {
                        break;
                    }
                    updateNode[i].Forward[i] = x.Forward[i];
                }
                while (_level > 0 && _header.Forward[_level] == null)
                {
                    _level--;
                }
                _size--;
            }
            else
            {
                throw new ArgumentException("The Key was not found");
            }
            return(x.Value);
        }
 public SkipListDictionary()
 {
     _header = new SkipNode <TK, TV>(MaxLevel);
     _level  = 0;
     _size   = 0;
 }