public int Add(AutoWrap obj)
        {
            var element = new StorageElem(obj);
            var gotLock = false;

            try
            {
                _lockObject.Enter(ref gotLock);

                if (FirstDeleted == -1)
                {
                    return(AddInArray(element));
                }
                else
                {
                    int newPos = FirstDeleted;
                    FirstDeleted      = _elements[newPos].Next;
                    _elements[newPos] = element;
                    return(newPos);
                }
            }
            finally
            {
                if (gotLock)
                {
                    _lockObject.Exit();
                }
            }
        }
        private int AddInArray(StorageElem element)
        {
            if (ElementsCount == _arraySize)
            {
                var temp = new StorageElem[_arraySize * 2];
                Array.Copy(_elements, 0, temp, 0, _elements.Length);
                _elements  = temp;
                _arraySize = _elements.Length;
            }

            _elements[ElementsCount] = element;
            var res = ElementsCount;

            ElementsCount++;
            return(res);
        }
        public void RemoveKey(int position)
        {
            if (position > 0 && position < _elements.Length && _elements[position].Wrap != null)
            {
                var gotLock = false;
                try
                {
                    _lockObject.Enter(ref gotLock);

                    var element = new StorageElem(null, FirstDeleted);
                    _elements[position] = element;
                    FirstDeleted        = position;
                }
                finally
                {
                    if (gotLock)
                    {
                        _lockObject.Exit();
                    }
                }
            }
        }