//============================================================ // <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); } } }
//============================================================ // <T>获得名称的哈希码。</T> // // @param name 名称 // @return 哈希码 //============================================================ protected override int InnerCode(string name) { if (_comparison == StringComparison.CurrentCultureIgnoreCase) { return(RHash.Code(name.ToLower())); } return(RHash.Code(name)); }
//============================================================ // <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)); }
//============================================================ // <T>[内部] 获得名称的哈希码。</T> // // @param name 名称 // @return 哈希码 //============================================================ protected virtual int InnerCode(N name) { return(RHash.Code(name)); }