有限大小的字典,删除最老的元素

本文关键字:删除 元素 字典 | 更新日期: 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'。