0

0

C# 如何实现一个LRU缓存 - 最近最少使用算法的C#实现

煙雲

煙雲

发布时间:2025-12-07 19:17:02

|

304人浏览过

|

来源于php中文网

原创

C#高效LRU缓存需用Dictionary+LinkedList实现O(1)的get/put:Dictionary映射key到链表节点,LinkedList按访问序维护节点,get时命中则移至尾部,put时更新或插入并超容删头。

c# 如何实现一个lru缓存 - 最近最少使用算法的c#实现

用 C# 实现一个高效 LRU 缓存,关键在于让 getput 操作都保持 O(1) 时间复杂度。标准解法是哈希表(Dictionary)配合双向链表(LinkedList),而不是靠 List 或 Queue 模拟——后者会导致移动或删除节点时退化到 O(n)。

核心结构:Dictionary + LinkedList

哈希表负责快速定位 key 对应的节点;双向链表按访问顺序组织节点,尾部为“最近使用”,头部为“最久未使用”。

  • Dictionary> 存 key → 链表节点映射
  • LinkedList 维护访问时序,新访问或新增都移到 Last
  • CachedItem 是自定义结构体或类,含 KeyValue

Get 操作:查到就移到链表尾

如果 key 存在,先从 Dictionary 取出对应节点,再调用 Remove() + AddLast() 把它挪到链表末尾,表示“刚刚被使用”。最后返回 value。

  • 没命中直接返回 default(TValue) 或抛异常,按需设计
  • 注意:不要新建节点或改 value,只做位置调整

Put 操作:更新或插入,并处理容量超限

分两种情况:

Mureka
Mureka

Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。

下载
  • key 已存在:更新节点的 value,再移至链表尾
  • key 不存在:新建 CachedItemAddLast 入链表,并加入 Dictionary
  • 插入后若 Count >= Capacity,则移除 First 节点,同时从 Dictionary 中删掉它的 key

小技巧与避坑点

避免常见低效写法:

  • 别用 List 手动找索引再 RemoveAt —— 删除中间元素是 O(n)
  • 别每次 get 都重建 Dictionary 或重排整个链表
  • 注意 null 值处理:value 类型为可空引用类型时,default 不代表“不存在”,建议用 TryGetValue + 显式判断
  • 线程安全?如需并发访问,可包装成 ConcurrentDictionary + 锁住链表操作,或用 ReaderWriterLockSlim

基本上就这些。C# 的 LinkedList 天然支持 O(1) 的节点移除和尾插,搭配 Dictionary 就能干净利落地落地 LRU。不需要第三方库,.NET 自带组件足矣。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.12.07

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

402

2023.08.14

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.8万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号