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

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

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

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

核心结构:Dictionary + LinkedList

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

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

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

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

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

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

分两种情况:

key 已存在:更新节点的 value,再移至链表尾key 不存在:新建 CachedItem,AddLast 入链表,并加入 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# 如何实现一个LRU缓存 – 最近最少使用算法的C#实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442777.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
.NET vs Node.js后端性能比较:真实场景下的基准测试分析
上一篇 2025年12月17日 19:22:56
C#如何操作Excel文件?NPOI与EPPlus两大类库使用教程与对比
下一篇 2025年12月17日 19:23:10

相关推荐

  • 【Linux/C++】Linux下C++命令行编译示例

    本文是关于c++++编程语言基础和linux系统操作基础的系列文章的第二部分。我们将详细介绍在linux环境下如何编译c++代码,并展示相关的编译示例和技巧。 文章目录 准备源代码编译实战引入目录进行编译使用-Wall、-std 参数进行编译生成库文件链接静态库生成可执行文件链接动态库生成可执行文件…

    2026年9月27日
    100
  • 怎么用豆包AI帮我转换编程语言 3分钟学会用AI实现代码语言自动转换

    怎么用豆包AI帮我转换编程语言 3分钟学会用AI实现代码语言自动转换怎么用豆包AI帮我转换编程语言 3分钟学会用AI实现代码语言自动转换怎么用豆包AI帮我转换编程语言 3分钟学会用AI实现代码语言自动转换怎么用豆包AI帮我转换编程语言 3分钟学会用AI实现代码语言自动转换

    豆包ai实现代码语言自动转换的方法如下:1. 准备好原始代码并明确标注目标语言,确保代码无语法错误且功能清晰;2. 使用豆包ai的对话功能进行提问,粘贴代码并准确描述转换需求,避免模糊指令;3. 检查转换后的代码是否可用,通过通读、运行测试用例及对比行为差异进行验证,如有问题可继续向ai反馈修改。 …

    2026年9月27日 • 用户投稿
    000
  • sublime怎么配置build system_Sublime Text自定义编译系统教程

    sublime怎么配置build system_Sublime Text自定义编译系统教程sublime怎么配置build system_Sublime Text自定义编译系统教程sublime怎么配置build system_Sublime Text自定义编译系统教程sublime怎么配置build system_Sublime Text自定义编译系统教程

    首先配置Sublime Text的编译系统以运行代码,依次点击Tools → Build System → New Build System…,编辑JSON模板,例如为Python设置{ “cmd”: [“python”, “-u&#822…

    2026年9月27日 • 用户投稿
    000
  • Stripe Webhook签名验证错误解析与中间件顺序优化

    Stripe Webhook签名验证错误解析与中间件顺序优化Stripe Webhook签名验证错误解析与中间件顺序优化Stripe Webhook签名验证错误解析与中间件顺序优化Stripe Webhook签名验证错误解析与中间件顺序优化

    Stripe Webhook签名验证时出现”Payload must be provided as a string or a Buffer”错误,通常是由于Express应用中全局express.json()中间件过早解析了原始请求体。本文将深入解析此问题,并提供通过调整中…

    2026年9月27日 • 用户投稿
    100
  • C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    本文旨在提供一个简洁明了的教程,指导开发者如何在C# .NET应用中,以纯资源服务器模式,通过外部授权服务器(如AWS Cognito或Asgardeo)实现REST API的安全保护。文章将重点介绍如何利用JWT Bearer认证机制,通过最小化配置,快速构建一个能够验证传入访问令牌的API服务,…

    2026年9月27日 • 用户投稿
    200
  • Java中高并发数据库同步与任务处理教程

    Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程

    本文旨在探讨Java应用中处理高并发数据库操作的有效策略,尤其针对大量数据行的计算与状态更新场景。我们将介绍如何利用ExecutorService和任务对象实现并发处理,并通过数据库连接池优化资源管理。重点关注数据库层面的并发控制机制,如事务和行级锁,以确保数据一致性和系统性能,并提供实际的代码示例…

    2026年9月27日 • 用户投稿
    200
  • Java高并发数据库同步处理:高效任务调度与连接管理实践

    Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践

    本文深入探讨了在Java应用中处理海量数据并发同步的策略。通过将数据库操作封装为独立任务,结合ExecutorService进行高效调度,并利用数据库连接池(如HikariCP)优化资源管理,同时强调了数据库层面事务和锁机制的重要性。文章提供了实现并发处理、标记已消费行以及确保系统高性能和数据一致性…

    2026年9月27日 • 用户投稿
    200
  • MySQL bin目录中存放的文件有哪些功能?

    MySQL bin目录中存放的文件有哪些功能?MySQL bin目录中存放的文件有哪些功能?MySQL bin目录中存放的文件有哪些功能?MySQL bin目录中存放的文件有哪些功能?

    MySQL作为一款常用的数据库管理系统,其bin目录是存放一些重要的可执行文件和脚本的地方。这些文件包含了一些关键的功能,下面将具体介绍MySQL bin目录中存放的文件以及它们的功能,并提供相应的代码示例。 mysql:这是MySQL的客户端工具,用于连接到MySQL服务器并与之交互。可以执行SQ…

    2026年9月27日 • 用户投稿
    100
  • 文本动画的类选择器应用与优化

    文本动画的类选择器应用与优化文本动画的类选择器应用与优化文本动画的类选择器应用与优化文本动画的类选择器应用与优化

    本文详细介绍了如何将基于ID的文本动画转换为基于类的实现,以支持在多个HTML元素上复用同一动画效果。通过JavaScript动态生成带有自定义CSS变量的标签,并结合CSS @keyframes动画,实现了可灵活应用于页面中任意指定元素的波浪式文本动画,并提供了两种优化方案。 1. 问题背景与目标…

    2026年9月27日 • 用户投稿
    100
  • MySQL事务的隔离级别与并发控制

    MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制

    标题:深入探讨MySQL事务的隔离级别与并发控制 随着数据库应用场景的日益复杂,事务的隔离级别与并发控制成为了数据库管理中不可或缺的重要话题。MySQL作为一款广泛使用的关系型数据库管理系统,其事务处理功能也备受广大开发者重视。本文将深入探讨MySQL事务的隔离级别与并发控制,并结合具体的代码示例进…

    2026年9月27日 • 用户投稿
    100
  • 代码 | 自适应大邻域搜索系列之(1) – 使用ALNS代码框架求解TSP问题

    代码 | 自适应大邻域搜索系列之(1) – 使用ALNS代码框架求解TSP问题代码 | 自适应大邻域搜索系列之(1) – 使用ALNS代码框架求解TSP问题代码 | 自适应大邻域搜索系列之(1) – 使用ALNS代码框架求解TSP问题代码 | 自适应大邻域搜索系列之(1) – 使用ALNS代码框架求解TSP问题

    前言 上次我们详细介绍了邻域搜索的各种概念,尤其是LNS和ALNS的具体过程。大家都理解了吗? 小编相信大家已经掌握了。不过,有热心网友表示上次没有代码,觉得不过瘾~别急,代码会让你们大饱眼福的…… 由于ALNS的代码量庞大,小编计划将其做成一个系列,逐步为大家讲解,让大家彻底掌握这个算法框架的代码…

    2026年9月27日 • 用户投稿
    000
  • 深拷贝与浅拷贝的区别是什么?如何实现深拷贝?

    深拷贝与浅拷贝的区别是什么?如何实现深拷贝?深拷贝与浅拷贝的区别是什么?如何实现深拷贝?深拷贝与浅拷贝的区别是什么?如何实现深拷贝?深拷贝与浅拷贝的区别是什么?如何实现深拷贝?

    深拷贝会递归复制对象所有嵌套属性,确保新旧对象完全独立,而浅拷贝仅复制引用,导致修改相互影响;常用深拷贝方法包括JSON.parse(JSON.stringify(obj))、递归函数处理循环引用和特殊对象,或使用Lodash的_.cloneDeep()及现代API structuredClone(…

    2026年9月27日 • 用户投稿
    100
  • 什么是泛型?泛型擦除是什么意思?有什么好处和局限?

    什么是泛型?泛型擦除是什么意思?有什么好处和局限?什么是泛型?泛型擦除是什么意思?有什么好处和局限?什么是泛型?泛型擦除是什么意思?有什么好处和局限?什么是泛型?泛型擦除是什么意思?有什么好处和局限?

    泛型通过类型参数提升代码复用与编译期类型安全,Java采用泛型擦除机制以兼容旧版本并简化JVM,但导致运行时无法获取泛型信息,需通过Class对象、通配符、类型令牌等策略应对。 泛型,简单来说,就是我们在编写代码时,能够让方法、类或接口处理多种数据类型的一种能力。它就像给我们的代码加了一层“智能外壳…

    2026年9月27日 • 用户投稿
    100
  • Oracle数据库实例详解

    Oracle数据库实例详解Oracle数据库实例详解Oracle数据库实例详解Oracle数据库实例详解

    Oracle数据库实例详解 Oracle数据库是全球著名的关系型数据库管理系统,被广泛应用于企业级应用程序的数据存储和管理。在Oracle数据库中,数据库实例是一个重要概念,它表示一个Oracle数据库服务器进程和内存结构的集合,用于处理客户端应用程序对数据库的操作请求。在本文中,我们将详细探讨Or…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么格式化代码_Sublime Text代码格式化设置与快捷键

    sublime怎么格式化代码_Sublime Text代码格式化设置与快捷键sublime怎么格式化代码_Sublime Text代码格式化设置与快捷键sublime怎么格式化代码_Sublime Text代码格式化设置与快捷键sublime怎么格式化代码_Sublime Text代码格式化设置与快捷键

    Sublime Text通过安装HTML-CSS-JS Prettify等插件可实现代码格式化,需先安装Package Control,再通过命令面板搜索并安装插件,随后在Key Bindings中添加快捷键配置,如Ctrl+Alt+F用于格式化JS/HTML/CSS文件,保存后即可使用;注意确保文…

    2026年9月26日 • 用户投稿
    200
  • Node.js spawn 命令参数解析与 shell: true 的应用

    Node.js spawn 命令参数解析与 shell: true 的应用Node.js spawn 命令参数解析与 shell: true 的应用Node.js spawn 命令参数解析与 shell: true 的应用Node.js spawn 命令参数解析与 shell: true 的应用

    本文探讨Node.js child_process.spawn 函数在处理复杂命令行参数时遇到的常见问题,特别是当参数包含路径或需要特殊解释时,可能导致目标程序(如Java)无法正确识别。通过引入 shell: true 选项,并结合正确的参数格式化,可以有效解决此类问题,同时强调了使用此选项时的安…

    2026年9月26日 • 用户投稿
    100
  • Windows Server 2012 Hyper-V群集图文教程

    Windows Server 2012 Hyper-V群集图文教程Windows Server 2012 Hyper-V群集图文教程Windows Server 2012 Hyper-V群集图文教程Windows Server 2012 Hyper-V群集图文教程

    接下来我们将继续测试windows server 2012 hyper-v群集功能,以实现虚拟机的高可用性。 实验环境: 四台服务器均运行Windows Server 2012 DataCenter操作系统。 SRV2012服务器上安装了iSCSI目标服务器角色,并配置了两个虚拟磁盘,供两台群集服务…

    2026年9月26日 • 用户投稿
    200
  • 浅谈 Windows 桌面端触摸架构演进

    浅谈 Windows 桌面端触摸架构演进浅谈 Windows 桌面端触摸架构演进浅谈 Windows 桌面端触摸架构演进浅谈 Windows 桌面端触摸架构演进

    我在和小伙伴水触摸相关的坑,说到了上古的触摸,很难和小伙伴统一知识,于是就写了本文用于告诉大家,桌面端的触摸架构是如何一步步演进的 所有触摸架构都建立在系统之上,和系统版本相关。所以可以通过系统划分。虽然说是触摸架构,但是我能知道的也就是应用层面的接口和编程方法,如果是小伙伴被标题吸引过来的,想看触…

    2026年9月26日 • 用户投稿
    200
  • CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch用于主线程等待其他线程完成操作,CyclicBarrier用于多线程相互等待至屏障点后集体执行,Semaphore用于控制并发访问资源的线程数量。 CountDownLatch, CyclicBarrier, Semaphore 都是并发编程中用于线程同步的工具,但它们的…

    2026年9月26日 • 用户投稿
    600
  • 请描述Java的内存区域(运行时数据区)

    请描述Java的内存区域(运行时数据区)请描述Java的内存区域(运行时数据区)请描述Java的内存区域(运行时数据区)请描述Java的内存区域(运行时数据区)

    Java运行时数据区分为程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区,其中堆和方法区为线程共享,其余为线程私有;程序计数器记录线程执行位置,虚拟机栈管理方法调用的栈帧,本地方法栈服务Native方法,堆存放对象实例并由GC管理,方法区存储类元数据和常量池;JDK 8后方法区由元空间替…

    2026年9月26日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信