繁体   English   中英

从字典中删除最旧的项目

[英]Removing the oldest item from a Dictionary

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

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

我将如何以最好的方式做到这一点? 我已经研究过使用SortedDictionary但是由于keysitems都没有关于添加时间/顺序的任何信息,因此无法弄清楚如何编写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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM