从字典中删除最旧的项

本文关键字:删除 字典 | 更新日期: 2023-09-27 18:13:42

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

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

我该如何以最好的方式去做呢?我已经研究过使用SortedDictionary,但无法弄清楚如何编写IComparer,因为keysitems都没有关于添加它们的时间/顺序的任何信息。

保持一个单独的SortedDictionary<DateTime, string>DateTime IComparer是一个明智的解决方案吗?这样,当添加新文件时,可以找到最老的添加文件的路径,并与我的Dictionary中的正确图像匹配。虽然这感觉像是一个高级的解决方案。有没有被忽视的或内置的解决方案?

从字典中删除最旧的项

听起来您想要一个最近最少使用的(LRU)缓存("首先丢弃最近最少使用的项")。有一些在网络上浮动的实现:

  • http://code.google.com/p/csharp-lru-cache/(写:Bob Rossney)
  • http://www.codeproject.com/KB/recipes/LRUCache.aspx(作者:Brian Agnes)

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

它允许你设置条件,当相应的缓存项被丢弃等,它允许在一个项目即将被删除的情况下回调(见http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.aspx)。

你可以通过使用CacheItemPolicy.SlidingExpiration来实现你所描述的缓存策略(它被称为LRU -最近最少使用)

我建议你让自己更容易,在字典中创建字典。

例如:

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

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

我建议不要使用字典,而是使用带有自定义类的List,该类接受位图,字符串和日期时间,如:

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

然后您可以使用List<ImageLocation>来存储您的图像。按时间加载排序,然后删除日期时间最早的那个。

也就是说,如果你不打算使用LRU缓存,