LRUCache c#

匿名 (未验证) 提交于 2019-12-02 22:10:10

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

我们来看下输出结果

文章来源: LRUCache c#
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!