[英]Removing the oldest item from a Dictionary
我正在使用WPF应用程序,该应用程序的任务是显示大量位图文件。 将来,我计划使用矢量图形来实现解决方案,但是现在我遇到了以下问题:
为了最小化我的应用程序从磁盘读取文件的时间,我创建了Dictionary<string, BitmapImage>
(其中string是图像的文件路径)来保存最近使用的图像。 如果请求了最近查看过的图像,程序将从Dictionary
而不是从磁盘中获取图像。 但是,随着查看的图像数量的增加,程序使用的RAM数量也随之增加。 因此,我的想法是保存有限数量的图像,然后从磁盘加载新图像,然后覆盖我的Dictionary
最旧的图像。
我将如何以最好的方式做到这一点? 我已经研究过使用SortedDictionary
但是由于keys
或items
都没有关于添加时间/顺序的任何信息,因此无法弄清楚如何编写IComparer
。
明智的解决方案是将单独的SortedDictionary<DateTime, string>
与DateTime IComparer
一起使用吗? 这样,添加新文件时,可以找到最旧添加文件的路径,并与我的Dictionary
的正确图像匹配。 但是,这种感觉就像是高级解决方案。 有没有被忽视或内置的解决方案?
听起来好像您想要一个最近最少使用(LRU)缓存 (“首先丢弃最近最少使用的项目”)。 网络上有一些实现方式:
如果您使用的是.NET 4,则有一个内置的缓存机制-有关演练,请参见http://msdn.microsoft.com/zh-cn/library/dd997362.aspx
它允许您设置何时丢弃各个缓存的项目等的条件 ,并允许在项目将被删除的情况下进行回调(请参阅http://msdn.microsoft.com/zh-cn/library/system。 runtime.caching.cacheitempolicy.aspx )。
您可以使用CacheItemPolicy.SlidingExpiration实施您描述的缓存策略(称为LRU-最近最少使用 )。
我建议您自己动手,在字典中创建字典。
例如:
Dictionary<DateTime, Dictionary<string, Image>> SortedByDate;
我不确定排序字典如何以及是否对日期进行正确排序,但是如果可以,并且最旧的等于最后一个条目,则可以很容易地删除该条目。
我建议不要使用字典,而是使用带有自定义类的List,该类带有位图,字符串和DateTime,例如:
public Class ImageLocation{
public BitmapImage image;
public string location;
public DateTime timeLoaded;
}
然后,您可以使用List<ImageLocation>
来存储图像。 按timeLoaded对它们进行排序,然后删除最早的DateTime。
也就是说,如果由于某种原因不打算使用LRU缓存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.