有限大小的字典,删除最老的元素
本文关键字:删除 元素 字典 | 更新日期: 2023-09-27 18:07:02
是否存在可用于散列数据的现有数据结构,从而能够删除最老的元素?
我现在想到的方法是有一个字典和一个队列,使用字典进行快速查找,并能够使用队列从字典中删除最旧的元素。
您可以使用OrderedDictionary。这将保持插入顺序(不像SortedDictionary
将按键排序)。然后,您可以删除第一个可用的元素,该元素被认为是最老的。
OrderedDictionary是一个很好的建议,但如果您需要字典中的字符串以外的类型,请尝试这个;
public sealed class SizedDictionary<TKey, TValue> : Dictionary<TKey, TValue> {
private int maxSize;
private Queue<TKey> keys;
public SizedDictionary(int size) {
maxSize = size;
keys = new Queue<TKey>();
}
new public void Add (TKey key, TValue value) {
if (key==null) throw new ArgumentNullException();
base.Add(key, value);
keys.Enqueue(key);
if (keys.Count > maxSize) base.Remove(keys.Dequeue());
}
new public bool Remove (TKey key) {
if (key==null) throw new ArgumentNullException();
if (!keys.Contains(key)) return false;
var newQueue = new Queue<TKey>();
while (keys.Count>0) {
var thisKey = keys.Dequeue();
if (!thisKey.Equals(key)) newQueue.Enqueue(thisKey);
}
keys=newQueue;
return base.Remove(key);
}
}
我使用一个密封类,因为我们只是隐藏了添加和删除方法,所以如果这个类被继承,它将不清楚使用的是哪个版本。更完整的解决方案是使用内部字典,而不是继承,但这会使
System.Collections.Generic.SortedList
只是一个按键排序的字典。如果键在某种程度上是临时的,当你想添加另一个条目时,当你达到一定的大小时,你可以简单地使用RemoveAt
删除第一个元素。
很可能,由于您提到了Dictionary
,您可能没有临时键。但是,Dictionary
只是KeyValuePair<K,V>
对象的集合。因此,您可以有一个排序列表,其中值是KeyValuePair<K,V>
,键是添加元素的日期/时间。
既然您有特定的需求,我将实现字典后面有一个队列/缓冲区(例如在评论中提到的循环缓冲区)。
OrderedDictionary是一个很好的选择,也是一个很好的来源,关于如何做到这一点(我不想在这里发布它,但你可以很容易地找到它)-你只需要比ArrayList更好的东西来保存你的元素(并做退队列)-因为你不断地删除'first'。