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 = ;
private bool isSequence = false; public LRUCache(int sz):this(sz,false)
{ } public LRUCache(int sz, bool isSq)
{
isSequence = isSq;
size = sz < ? : sz;
dict = new Dictionary<string, T>(size);
list = new LinkedList<T>();
} public int Size
{
get { return size; }
set { size = value < ? : 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>();
lruCache.Put("", );
lruCache.Put("", );
lruCache.Put("", );
lruCache.Put("", );
lruCache.Put("", );
lruCache.Get("");
lruCache.Get(""); Console.WriteLine("最近最少方式Test...");
foreach (var item in lruCache.Values)
{
Console.WriteLine(item.ToString());
} LRUCache<int> lruCache1 = new LRUCache<int>(, true);
lruCache1.Put("", );
lruCache1.Put("", );
lruCache1.Put("", );
lruCache1.Put("", );
lruCache1.Put("", ); lruCache1.Get("");
lruCache1.Get(""); Console.WriteLine("顺序方式Test...");
foreach (var item in lruCache1.Values)
{
Console.WriteLine(item.ToString());
}
}

我们来看下输出结果

 

LRUCache c#的更多相关文章

  1. LruCache算法原理及实现

    LruCache算法原理及实现 LruCache算法原理 LRU为Least Recently Used的缩写,意思也就是近期最少使用算法.LruCache将LinkedHashMap的顺序设置为LR ...

  2. Android开发学习之路-LruCache使用和源码分析

    LruCache的Lru指的是LeastRecentlyUsed,也就是近期最少使用算法.也就是说,当我们进行缓存的时候,如果缓存满了,会先淘汰使用的最少的缓存对象. 为什么要用LruCache?其实 ...

  3. LruCache缓存

    LruCache通常用于实现内存缓存,采用的缓存算法是LRU(Least Recently Used)即近期最少使用算法,其核心思想是:当缓存满的时候,会优先淘汰那些近期最少使用的缓存对象. 1.Lr ...

  4. LruCache为GridView异步加载大量网络图片

    MainActivity如下: import android.os.Bundle; import android.widget.GridView; import android.app.Activit ...

  5. Android内存优化之 LruCache与DiskLruCache

    在日常的Adroid开发中我们经常遇到需要处理大量图片的地方,但Android手机的内存有限该怎么避免手机 内存溢出导致app程序oom,google提供了两种解决方式 LruCache LruCac ...

  6. LruCache详解之 Android 内存优化

    概念: LruCache 什么是LruCache? LruCache实现原理是什么? 这两个问题其实可以作为一个问题来回答,知道了什么是 LruCache,就只然而然的知道 LruCache 的实现原 ...

  7. 利用LruCache为GridView异步加载大量网络图片完整示例

    MainActivity如下: package cc.testlrucache; import android.os.Bundle; import android.widget.GridView; i ...

  8. 利用LruCache为GridView加载大量本地图片完整示例

    MainActivity如下: package cc.testlrucache; import android.os.Bundle; import android.widget.GridView; i ...

  9. Android 使用 LruCache 缓存图片

    在你应用程序的 UI 界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来.在很多情况下,(比如使用 ListView, GridView 或者 ViewP ...

  10. Android LruCache(Picasso内存缓存)

    Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部,当cache已满的时候加入新的item时,在队列尾部的item会被回收. 如果你cache的某个值需要 ...

随机推荐

  1. nginx正向代理访问百度地图API

    正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...

  2. git备忘

    git checkout . 放弃本地修改

  3. 使用TCPDF输出完美的中文PDF文档

    TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进.支持UTF-8,Unicode,HTML和XHTML.在基于PHP开发的Web应用中,使用它来输出PDF文 ...

  4. JSON.parse() 方法解析一个JSON字符串

    JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.pa ...

  5. UNITY 手动定制inspector

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; us ...

  6. js 倒计时功能,获取当前时间的年月日,时分秒

    一.实现当前时间到指定截止时间的倒计时功能 <html> <head> <title>TEST</title> </head> <bo ...

  7. java把流抛给浏览器下载时,当下载的文件文件名为中文时,出现中文名被替换为“----------”的情况

    比如说,下载的文件名为: 软件分析报告.docx,当使用流抛给浏览器下载时,浏览器下载的文件为:-----------.docx 出现这种情况的原因:大体的原因就是header中只支持ASCII,所以 ...

  8. Multithreading in C

    Multithreading in C, POSIX(可移植操作系统接口Portable Operating System Interface X ) style Multithreading - A ...

  9. Chrome 扩展 Vue Devtools

    Vue.js devtools是基于google chrome浏览器的一款调试vue.js应用的开发者浏览器扩展,可以在浏览器开发者工具下调试代码. 1)首先在github下载devtools源码,地 ...

  10. mongo学习- group操作

    group可以使用 $sum,$avg,$max,$min,$first,$last