欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

LRUCache c#

程序员文章站 2022-05-13 16:31:01
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方法中,会将对象移除,并置于队首。
下面我们来进行测试

LRUCache c#
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#