从词典中删除最旧的项目

时间:2011-11-08 09:46:12

标签: c# .net collections dictionary

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

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

我怎样才能以最好的方式做到这一点?我已经考虑使用SortedDictionary但无法弄清楚如何编写IComparer,因为keysitems都没有关于时间/顺序的任何信息加入了。

将单独的SortedDictionary<DateTime, string>DateTime IComparer保持一致是一个明智的解决方案吗?这样,当添加新文件时,可以找到最早添加的文件的路径,并与我Dictionary中的正确图像匹配。这种感觉就像一个先进的解决方案。任何被忽视或内置的解决方案?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)。

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

答案 2 :(得分:1)

我建议您自己轻松一点,并在字典中创建字典。

例如:

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

我不确定排序字典是如何以及是否排序正确的日期,但如果确实如此,最旧的等于最后一个条目,您可以很容易地删除该条目。

答案 3 :(得分:0)

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

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

然后您可以使用List<ImageLocation>来存储图片。按timeLoaded对它们进行排序,然后删除具有最早DateTime的那个。

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