2011-11-08 73 views
2

我正在處理一個WPF應用程序,其任務是顯示大量的位圖文件。在未來,我計劃實現一個解決方案,使用矢量圖形,但現在我有這個問題:從字典中刪除最舊的項目

爲了儘量減少我的應用程序從磁盤讀取文件的時間我創建了一個Dictionary<string, BitmapImage>(其中字符串是圖像的文件路徑)保存最新使用的圖像。如果請求最近查看的圖像,程序將從Dictionary而不是從磁盤中讀取該圖像。但是,隨着查看的圖像數量的增加,程序使用的RAM數量也會增加。所以我的想法是保存有限的圖像,並且從磁盤加載新圖像,覆蓋從我的Dictionary最老的一個。

我該如何以最好的方式去做這件事?我研究過使用SortedDictionary,但不知道如何編寫IComparer,因爲keysitems都沒有關於它們添加的時間/順序的任何信息。

會保持一個單獨的SortedDictionary<DateTime, string>DateTime IComparer是一個明智的解決方案?這樣,當添加一個新文件時,可以找到最早添加文件的路徑,並與我的Dictionary中的正確圖像相匹配。儘管如此,這種感覺像是一種先進的解決方案。任何被忽視或內置的解決方案?

回答

0

我建議你讓自己容易,並在字典中創建一本字典。

例如:

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

我不確定如何,如果排序的字典排序正確的日期,但如果這樣做,最大等於最後一項你擁有了它很容易刪除該條目。

+0

這不再允許您通過路徑(字符串)進行搜索,但是,它呢? – ssube

+0

謝謝,我會嘗試一個!根據http://stackoverflow.com/questions/453124/datetime-as-key-in-a-sorteddictionaryk-v「DateTime」應該作爲一個關鍵。 – Tobbe

+0

@peachykeen沒想到!我會進一步研究。 – Tobbe

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)。

您可以使用CacheItemPolicy.SlidingExpiration來實現您描述的緩存策略(稱爲LRU - least recently used)。

+0

謝謝,但我們在3.5。儘管如此,我會記住這一點,以便進一步探索! – Tobbe

0

我建議對一本字典,而是使用與自定義類,它的位圖,字符串和日期時間,類似的列表:

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

然後你可以使用一個List<ImageLocation>存儲您的圖像。按timeLoaded排序它們,然後刪除最早的DateTime。

也就是說,如果你不打算使用LRU緩存出於某種原因。