Dictionary实现先进先出代替Queue
Queue删除其中一个元素比较麻烦,这是一个重码校验的类,主要处理是用Dictionary代替Queue了。目前使用下来还算稳定。代码贴出来给有缘人参考。
/// <summary> /// 用Dictionary实现的重码校验队列 /// 1、支持先进先出 /// 2、支持移除队列里元素 /// 3、支持从文件和数据库(外部数据源)里加载队列 /// 4、支持把当前队列数据序列化成二进制文件 /// </summary> public class RepeatCodeChecker : ConcurrentDictionary<long, string> { /// <summary> /// 工作计数 /// </summary> public int WorkCount { get; set; } /// <summary> /// 最大元素个数 /// </summary> public int MaxCount { get; set; } /// <summary> /// 加载已有数据到队列 /// </summary> public Action<List<string>> LoadItemFromDataSource; /// <summary> /// 检查条码是否重复,并确定是否加入队列 /// </summary> public Func<string, bool, bool> CheckIsRepeat; /// <summary> /// 将队列已有数据序列化成二进制文件 /// </summary> public Action<string> SaveToBinaryFile; /// <summary> /// 从二进制文件里加载队列 /// </summary> public Func<string, bool> LoadQueueFormFile; /// <summary> /// 添加一个元素到队列末尾 /// </summary> /// <param name="code"></param> public void Enqueue(string code) { var key = DateTime.Now.Ticks; if (ContainsKey(key)) { key += (Count + 1); } TryAdd(key, code); WorkCount++; //如果达到最大元素个数移除最前面的元素 if (MaxCount != 0 && Count > MaxCount) { Dequeue(); } } /// <summary> /// 从队列移除第一个元素 /// </summary> /// <returns></returns> public string Dequeue() { var minKey = this.Min(k => k.Key); string val; TryRemove(minKey, out val); return val; } /// <summary> /// 从队列里删除一个已经存在的元素 /// </summary> /// <param name="code"></param> /// <returns></returns> public bool RemoveCode(string code) { try { var valObj = this.FirstOrDefault(t => t.Value == code); string val; TryRemove(valObj.Key, out val); return true; } catch { return false; } } public RepeatCodeChecker() { //从外部数据源加载队列 LoadItemFromDataSource = (list) => { foreach (string code in list) Enqueue(code); }; //校验重码的委托声明 CheckIsRepeat = (val, isAddtoQueue) => { bool result = this.Any(item => item.Value == val); //不存在且需要加入则自动加入队列 if (!result && isAddtoQueue) { Enqueue(val); } return result; }; //序列化成二进制文件 SaveToBinaryFile = (filePath) => { if (File.Exists(filePath)) File.Delete(filePath); using (FileStream fsWrite = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { BinaryFormatter bf = new BinaryFormatter(); try { bf.Serialize(fsWrite, this); } catch (Exception e) { throw new Exception(e.Message); } finally { fsWrite.Flush(); fsWrite.Close(); } } }; //从文件加载队列 LoadQueueFormFile = (filePath) => { if (File.Exists(filePath)) { using (FileStream fs = new FileStream(filePath, FileMode.Open)) { BinaryFormatter bf1 = new BinaryFormatter(); try { Dictionary<string, string> dict = bf1.Deserialize(fs) as Dictionary<string, string>; if (dict != null) { foreach (var item in dict) { Enqueue(item.Value); } } return true; } catch { return false; } finally { fs.Close(); } } } return false; }; } /// <summary> /// 获取最前面的元素 /// </summary> /// <returns></returns> public string FirstOrDefault() { if (Count == 0) return string.Empty; long minKey = this.Min(k => k.Key); return this[minKey]; } /// <summary> /// 获取最前面的元素 /// </summary> /// <returns></returns> public string LastOrDefault() { if (Count == 0) return string.Empty; long maxKey = this.Max(k => k.Key); return this[maxKey]; } }
作者:数据酷软件
出处:https://www.cnblogs.com/datacool/p/datacool20180816.html
关于作者:20年编程从业经验,持续关注MES/ERP/POS/WMS/工业自动化
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
联系方式: qq:71008973;wx:6857740733
基于人脸识别的考勤系统 地址: https://gitee.com/afeng124/viewface_attendance_ext
自己开发安卓应用框架 地址: https://gitee.com/afeng124/android-app-frame
WPOS(warehouse+pos) 后台演示地址: http://47.239.106.75:8080/
分类:
程序设计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构