예제 #1
0
 //============================================================
 // <T>确保容量。</T>
 // <P>如果内存比指定内存大,则重新收集内存。</P>
 //
 // @param size 容量大小
 //============================================================
 public void EnsureSize(int size)
 {
     if (null == _values)
     {
         // 初次构造时
         _entries = new RHash.FEntry[size];
         _names   = new N[size];
         _values  = new V[size];
     }
     else if (size > _values.Length)
     {
         // 计算大小
         size += _values.Length;
         // 生成名称数组
         N[] names = new N[size];
         Array.Copy(_names, 0, names, 0, _count);
         _names = names;
         // 生成内容数组
         V[] values = new V[size];
         Array.Copy(_values, 0, values, 0, _count);
         _values = values;
         // 调整哈希表
         int factor = _entries.Length * RHash.FACTOR;
         if (size > factor)
         {
             _entries = RHash.Resize(_entries, size);
         }
     }
 }
예제 #2
0
 //============================================================
 // <T>获得名称的哈希码。</T>
 //
 // @param name 名称
 // @return 哈希码
 //============================================================
 protected override int InnerCode(string name)
 {
     if (_comparison == StringComparison.CurrentCultureIgnoreCase)
     {
         return(RHash.Code(name.ToLower()));
     }
     return(RHash.Code(name));
 }
예제 #3
0
        //============================================================
        // <T>移除指定名称的内容。</T>
        //
        // @param name 名称
        //============================================================
        public virtual V Remove(N name)
        {
            // 检查名称
            if (null == name)
            {
                throw new NullReferenceException();
            }
            // 查找节点
            int index = -1;
            int hash  = InnerCode(name);
            int pos   = hash % _entries.Length;

            RHash.FEntry prior = _entries[pos];
            RHash.FEntry entry = prior;
            while (null != entry)
            {
                if (entry._hash == hash)
                {
                    if (InnerEquals(name, _names[entry._index]))
                    {
                        index = entry._index;
                        if (entry == prior)
                        {
                            _entries[pos] = entry._next;
                        }
                        else
                        {
                            prior._next = entry._next;
                        }
                        break;
                    }
                }
                prior = entry;
                entry = entry._next;
            }
            // 有移除操作
            if (-1 != index)
            {
                V old = _values[index];
                // 修正哈希入口列表
                RHash.Remove(_entries, index);
                // 修正名称和内容数组
                int move = _count - index - 1;
                if (move > 0)
                {
                    Array.Copy(_names, index + 1, _names, index, move);
                    Array.Copy(_values, index + 1, _values, index, move);
                }
                // 修正最后元素
                _count--;
                _names[_count]  = default(N);
                _values[_count] = default(V);
                return(old);
            }
            return(default(V));
        }
예제 #4
0
 //============================================================
 // <T>[内部] 获得名称的哈希码。</T>
 //
 // @param name 名称
 // @return 哈希码
 //============================================================
 protected virtual int InnerCode(N name)
 {
     return(RHash.Code(name));
 }