C#类似hashtable的结构
请大家帮忙写出这个结构的定义和代码,或者写出大概思路也行,尽量详细,我的编程能力有限,又急用,多谢了 展开
从需求可以看出你需要的是一个有固定大小、有先进先出队列特性的哈希表。从这点上看,我们可以有三种实现方式。
第一种,继承HashTable,为其增加容量和出入队列的处理。这是最容易实现的方法,因为Queue的接口HashTable都有,我们只需要重载相关方法即可。需要解决的问题是,HashTable的元素以ICollection形式存储,元素是没有位置索引的,要删除最旧的数据,我们需要一些辅助,这里是一个辅助队列,用于存储各项元素的key。由于队列总是先进先出,所以每次从队列中取出的元素就是最旧的一个键值对的key。
public class HashTableQueue : Hashtable
{
uint _maxCapacity;
Queue orderQ = new Queue();
public int MaxCapacity { get { return (int)_maxCapacity; } }
public HashTableQueue(uint maxCapacity)
: base()
{
_maxCapacity = maxCapacity;
}
public override void Add(object key, object value)
{
//先加元素
base.Add(key, value);
//加的同时向辅助队列入队一个键
orderQ.Enqueue(key);
//判断是否容量超限,如超限则从队列中取出最旧的一个键,然后从哈希表删除对应的键值对
if (Count > _maxCapacity)
Remove(orderQ.Dequeue());
}
}
使用时需要在构造中指定最大容量(非负整形),为了安全起见,我并未允许在运行中修改最大容量。示例代码:
HashTableQueue htq = new HashTableQueue(3);
htq.Add(1, 1);
htq.Add(2, 1);
htq.Add(3, 5);
htq.Add(4, 2);
运行完毕后的哈希表只有三个键值对,分别是{2,1},{3,5},{4,2}.
第二种方法,继承队列,用代码为其添加哈希表的特性。这个我就不写了,因为哈希表的接口和功能远比队列多,用代码去重现相对比较费事。比如哈希表的ICloneable、ISerializable、IDictionary接口,在队列上实现起来都比较复杂。最大的缺陷,队列不能直接删除指定元素。
第三种方法,你可以自己新建一个类来满足需求。这个方法我相当的不推荐,因为不继承自现有结构如HashTable、Dictionary的话,你至少要继承IDictionary<object,object>、IEnumerable接口,而且很可能内部需要使用 List<Tuple<object,object,int>这样的有三列的元素的集合来维护数据和排序值,光这些就够写一阵了。
如果你需要用第二、三种方法实现,请追问或给我小纸条。