【问题标题】:Removing the oldest item from a Dictionary从字典中删除最旧的项目
【发布时间】:2011-12-24 07:27:26
【问题描述】:

我正在使用一个任务是显示大量位图文件的 WPF 应用程序。将来我计划使用矢量图形实现一个解决方案,但现在我遇到了这个问题:

为了尽量减少我的应用程序从磁盘读取文件的时间,我创建了一个Dictionary<string, BitmapImage>(其中字符串是图像的文件路径)来保存最近使用的图像。如果请求了最近查看过的图像,程序会从Dictionary 而不是从磁盘中获取它。但是,随着查看的图像数量的增加,程序使用的 RAM 量也会增加。所以我的想法是保留有限数量的图像,并在从磁盘加载新图像时,覆盖我的Dictionary 中最旧的图像。

我将如何以最好的方式做到这一点?我已经研究过使用SortedDictionary,但不知道如何编写IComparer,因为keysitems 都没有关于添加时间/顺序的任何信息。

SortedDictionary<DateTime, string>DateTime IComparer 分开是一个明智的解决方案吗?这样,当添加新文件时,可以找到最旧添加文件的路径,并与我的Dictionary 中的正确图像匹配。不过,这种感觉就像是一种高级解决方案。任何被忽视或内置的解决方案?

【问题讨论】:

    标签: c# .net collections dictionary


    【解决方案1】:

    我建议你让自己轻松一点,在字典中创建一个字典。

    例如:

    Dictionary<DateTime, Dictionary<string, Image>> SortedByDate;
    

    我不确定排序字典如何以及是否对日期进行正确排序,但如果是正确的并且最旧的等于最后一个条目,则删除该条目相当容易。

    【讨论】:

    • 这不再允许您按路径(字符串)搜索,不是吗?
    • 谢谢,我试试那个!根据stackoverflow.com/questions/453124/… DateTime 应该作为一个键。
    • @peachykeen 没想到!我会进一步调查。
    • @peachykeen:如果要搜索路径,将内部字典存储在第二个变量中是有意义的。
    • @AndreFly 但是你会有多次相同的路径,这应该是同一个图像,再次违背了目的。两者都存储是必要的,但您不能以嵌套方式同时为两者编制索引。
    【解决方案2】:

    如果您使用的是 .NET 4,则有一个内置的缓存机制 - 有关演练,请参阅 http://msdn.microsoft.com/en-us/library/dd997362.aspx

    It allows you to set conditions when the respective cached item is discarded etc. 并且它允许在项目即将被删除的情况下进行回调(请参阅http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.aspx)。

    您可以使用CacheItemPolicy.SlidingExpiration 来实现您描述的缓存策略(称为LRU - least recently used)。

    【讨论】:

    • 谢谢,但我们使用的是 3.5。不过,我会记住这一点,以便进一步冒险!
    【解决方案3】:

    听起来您想要least recently used (LRU) cache(“首先丢弃最近最少使用的项目”)。网上流传着一些实现:

    【讨论】:

    • 我将使用 Bob Rossney 的那个。最好用一个好的,而不是自己做一个平庸的;P 谢谢!
    【解决方案4】:

    我建议不要使用字典,而是使用带有自定义类的 List,该类采用位图、字符串和 DateTime,例如:

    public Class ImageLocation{
        public BitmapImage image;
        public string location;
        public DateTime timeLoaded;
    }
    

    然后您可以使用List&lt;ImageLocation&gt; 来存储您的图像。按 timeLoaded 对它们进行排序,然后删除 DateTime 最早的那个。

    也就是说,如果您出于某种原因不打算使用 LRU 缓存。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2017-03-06
      • 2011-08-08
      • 2012-02-21
      • 2012-08-31
      • 2011-06-16
      • 2016-03-13
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多