从字典中删除最旧的项
本文关键字:删除 字典 | 更新日期: 2023-09-27 18:13:42
我正在使用一个WPF应用程序,任务是显示大量的位图文件。在未来,我计划使用矢量图形实现一个解决方案,但现在我有这个问题:
为了最大限度地减少应用程序从磁盘读取文件的时间,我创建了一个Dictionary<string, BitmapImage>
(其中string是图像的文件路径)来保存最近使用的图像。如果请求的映像最近被查看过,程序将从Dictionary
而不是从磁盘中获取它。但是,随着查看的图像数量增加,程序使用的RAM数量也会增加。所以我的想法是保留有限数量的图像,当从磁盘加载新的图像时,覆盖我的Dictionary
中最老的图像。
我该如何以最好的方式去做呢?我已经研究过使用SortedDictionary
,但无法弄清楚如何编写IComparer
,因为keys
或items
都没有关于添加它们的时间/顺序的任何信息。
保持一个单独的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缓存,