都是集合类,C#中同属命名空间System.Collections,“用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值”。不允许重复键。两者使用方法有很多类似之处。
在存储上,当把某个元素添加到HashTable时,将根据键的哈希代码将该元素放入存储桶中(意味着并不会按照存入顺序读取,表面看来是随机的排列的,但事实上有其算法),由于是散列算法所以会出现一个哈希函数能够为两个不同的键生成相同的哈希代码,该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。
若需要按照输入顺序输出,可以自定义继承于HashTable的类,实现如下(未验证)。
public class NoSortHashtable:Hashtable
{
private ArrayList keys = new ArrayList();
public NoSortHashtable()
{
}
public override void Add(object key, object value)
{
base.Add(key, value);
keys.Add(key);
} public override ICollection Keys
{
get
{
return base.Keys;
}
}
public override void Clear()
{
base.Clear();
keys.Clear();
}
public override void Remove(object key)
{
base.Remove(key);
keys.Remove(key);
}
public override IDictionaryEnumerator GetEnumerator()
{
return base.GetEnumerator();
}
}
但是事实上对于这样的key/value结构数据的存储,完全可以使用其他类,如SortedList。SortedList中的键值对可以按键排序,并可按照键和索引访问。内部维护两个数组以存储列表中的元素,即一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为DictionaryEntry对象进行访问的键/值对。键不能为null,但值可以。