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

煙雲
发布: 2025-12-07 19:17:02
原创
293人浏览过
C#高效LRU缓存需用Dictionary+LinkedList实现O(1)的get/put:Dictionary映射key到链表节点,LinkedList按访问序维护节点,get时命中则移至尾部,put时更新或插入并超容删头。

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

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

核心结构:Dictionary + LinkedList

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

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

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

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

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

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

分两种情况:

一览妙笔
一览妙笔

自媒体、编剧、营销人员写作工具

一览妙笔 50
查看详情 一览妙笔
  • key 已存在:更新节点的 value,再移至链表尾
  • key 不存在:新建 CachedItemAddLast 入链表,并加入 Dictionary
  • 插入后若 Count >= Capacity,则移除 First 节点,同时从 Dictionary 中删掉它的 key

小技巧与避坑点

避免常见低效写法:

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

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

以上就是C# 如何实现一个LRU缓存 - 最近最少使用算法的C#实现的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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