【问题标题】:c# limited Dictionaryc# 有限字典
【发布时间】:2011-04-28 05:53:45
【问题描述】:

我想建立一个字典(键,值), 但我希望这本词典的大小有限, 例如 1000 个条目, 所以当我丰富这个限制大小时,我想删除第一个元素并添加一个新元素(FIFO)。

我想使用字典,因为我总是在字典中搜索键(我需要它会很快)

如何做到这一点?

【问题讨论】:

  • 您说要在达到大小限制时删除第一个元素。你的意思是词典中输入的第一个项目吗?在这种情况下,您具有 FIFO 行为,而不是 LIFO。还是要删除索引位置 0 处的项目?删除位置 0 处的项目既不是 LIFO 也不是 FIFO。
  • 在这种情况下,请看我的回答。我认为其他任何答案都不能处理 FIFO。

标签: c# dictionary fifo


【解决方案1】:

要同时获取字典和 LIFO/FIFO 行为(用于删除最新/最旧条目),您可以使用 OrderedDictionary。见http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx

为了方便使用,您可以按照@ArsenMkrt 的建议从OrderedDictionary 派生您自己的类。

但是请注意,OrderedDictionary 不使用泛型,因此由于装箱(字典中的项目将插入为object)会产生一些低效率。克服这个问题的唯一方法是创建一个双重数据结构,将字典中的所有项目镜像到 Queue(对于 FIFO)或 Stack(对于 LIFO)。有关详细信息,请参阅“Qua”对以下 SO 问题的回答,该问题准确地处理了您需要一种有效方式来跟踪字典项的插入顺序的情况。

Fastest and most efficient collection type in C#

【讨论】:

    【解决方案2】:

    像这样从字典和 ovverride add 方法派生

    if(myDic.Count == MAXCOUNT - 1)
    {
        myDic.Remove(myDic[0]);
    }
    myDic.Add(key, item);
    

    【讨论】:

    • 如果新添加的项目获得索引0怎么办?还是之前添加的项目,因为您在添加之前删除了?
    • 这是要求,不是吗?
    • @ArsenMrkt 我不确定要求是什么。 OP说他想删除“第一个”项目。但这不是字典中输入的第一件事。删除零位置的项目既不是 LIFO 也不是 FIFO。我已要求 OP 澄清。
    • 一个简单的字典本身没有“排序”的概念,所以如果我添加 1、2、3、4 和 5,如果限制为 4,我希望删除 1。但是,如果字典以位置 0 中的 4 结尾,则会将其删除。当然,前提是您可以使用简单的索引器实际索引到字典内容(您通常不能这样做。)
    【解决方案3】:

    我不知道我们是否可以明确限制字典大小。有时回来我也想做同样的事情。

    我通过编写一种方法解决了这个问题,该方法不断手动检查字典计数,当它的大小超过一定限制时,它会从字典中删除一些条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2012-04-06
      • 2010-10-26
      • 2015-05-06
      • 2011-02-20
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多