LRUCache c#

来源:https://www.cnblogs.com/czly/archive/2018/06/05/9138944.html
-Advertisement-
Play Games

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

 

我們來看下輸出結果

 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、引用相等性與對象相等性 1. 引用相等性 引用到堆上同一個對象的兩個引用是相等的,這就是引用的相等性。 如果想要知道兩個引用是否相等,可以使用==來比較變數上的位元組組合,如果引用到相同的對象,位元組組合也會一樣: 2. 對象相等性 堆上的兩個不同對象在意義上是相同的,這就是對象的相等性。 兩個對象 ...
  • 如圖: 若幹倉庫都是能推不能拉,下麵顯示當前分支不跟蹤遠程分支,後來在這裡找到給分支建立跟蹤的方法,又在這裡找到在VS2017中敲git命令的方法,在此感謝上述博文的作者。總結一下: 在VS2017進入 > 【工具】菜單 > Nuget包管理器 > 程式包管理器控制台 在該控制臺中執行:git br ...
  • 剛好這次項目中遇到了這個東西,就來弄一下,挺簡單的,但是前臺調用的時候弄錯了,浪費了大半天的時間,本人也是菜鳥一枚。開始吧。(MVC的) @using Rattan.Core.Utility;@{ string ButtonScript = string.Empty;}@if (Rattan.Bas ...
  • 一、 樣式一 我們要實現上圖中的效果,需要如下的操作: 從工具欄上的“Smobiler Components”拖動一個VoiceRecorder控制項和一個ImageButton控制項到窗體界面上 修改ImageButton的屬性 1.BackColor屬性 設置控制項的背景色,將該屬性設置為“Gray” ...
  • select a,sys_guid() as b from mytable sys_guid() 是生成帶分隔符(-)的GUID的自定義函數 查詢B表的內容插入A表,MY_ID是A表的主鍵不可為空,因此需要B查詢出來的數據增加一列並且賦值插入A insert into A (plan_id,ship ...
  • 新建了一個類繼承EF Model類,運行報錯 EF Code First列名 'Discriminator' 無效 EF會把項目中在DbContext中引用的所有的Model類及這些Model類對應的子類都生成對應映射視圖。如果資料庫沒有對應表或欄位就會報錯。 在繼承的Model 類加上NotMap ...
  • 索引 NET Core應用框架之BitAdminCore框架應用篇系列 框架演示:http://bit.bitdao.cn 框架源碼:https://github.com/chenyinxin/cookiecutter-bitadmin-core 20180605更新內容 一、本次更新內容如下: 集 ...
  • 一、結論: 1.實例構造函數與靜態構造函數執行順序 一、初始化順序(依次是靜態變數、靜態構造函數、實例變數、實例構造函數) 二、初始化次數(靜態的都只會初始化一次) 三、初始化時機(使用類引用任何靜態成員之前對或者首次實例化類時會調用靜態構造函數,通過靜態構造函數初始化類級別的項,即靜態欄位。非靜態 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...