LRUCache是Least Recently Used 近期最少使用演算法的緩存,是android提供的一個緩存工具類。可以以兩種排序方式來輸出緩存,一種是按插入順序輸出,一種是按最近最少方式輸出,最近使用的放在隊首,使用頻率低的,間隔時間最長的放在隊尾。 下麵是實現 構造函數中傳入緩存大小和輸出緩 ...
LRUCache是Least Recently Used 近期最少使用演算法的緩存,是android提供的一個緩存工具類。可以以兩種排序方式來輸出緩存,一種是按插入順序輸出,一種是按最近最少方式輸出,最近使用的放在隊首,使用頻率低的,間隔時間最長的放在隊尾。
下麵是實現
using System; using System.Collections.Generic; namespace LY.Helper { public class LRUCache<T> { private Dictionary<string, T> dict; private LinkedList<T> list; private int size = 0; private bool isSequence = false; public LRUCache(int sz):this(sz,false) { } public LRUCache(int sz, bool isSq) { isSequence = isSq; size = sz < 10 ? 10 : sz; dict = new Dictionary<string, T>(size); list = new LinkedList<T>(); } public int Size { get { return size; } set { size = value < 10 ? 10 : value; } } public void Put(string key, T item) { T node; if(dict.TryGetValue(key, out node)) { list.Remove(node); dict[key] = item; list.AddFirst(item); } else { if(list.Count == size) list.RemoveLast(); dict[key] = item; list.AddFirst(item); } } public T Get(string key) { T node; if(dict.TryGetValue(key, out node)) { list.Remove(node); list.AddFirst(node); return node; } return default(T); } public ICollection<T> Values { get { if (isSequence) { return dict.Values; } else { return list; } } } } }
構造函數中傳入緩存大小和輸出緩存順序。
我們在調用Put方法時,當緩存長度超過我們構造函數中傳入的大小時,會將隊尾的移除。將新傳入的對象放在隊首。
我們從LRUCache中獲取對象時,在Get方法中,會將對象移除,並置於隊首。
下麵我們來進行測試
private void btnTest_Click(object sender, EventArgs e) { LRUCache<int> lruCache = new LRUCache<int>(10); lruCache.Put("1", 1); lruCache.Put("2", 2); lruCache.Put("3", 3); lruCache.Put("4", 4); lruCache.Put("5", 5); lruCache.Get("2"); lruCache.Get("3"); Console.WriteLine("最近最少方式Test..."); foreach (var item in lruCache.Values) { Console.WriteLine(item.ToString()); } LRUCache<int> lruCache1 = new LRUCache<int>(10, true); lruCache1.Put("1", 1); lruCache1.Put("2", 2); lruCache1.Put("3", 3); lruCache1.Put("4", 4); lruCache1.Put("5", 5); lruCache1.Get("2"); lruCache1.Get("3"); Console.WriteLine("順序方式Test..."); foreach (var item in lruCache1.Values) { Console.WriteLine(item.ToString()); } }View Code
我們來看下輸出結果