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 + );
}
TryAdd(key, code);
WorkCount++;
//如果达到最大元素个数移除最前面的元素
if (MaxCount != && 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 == )
return string.Empty;
long minKey = this.Min(k => k.Key);
return this[minKey];
}
/// <summary>
/// 获取最前面的元素
/// </summary>
/// <returns></returns>
public string LastOrDefault()
{
if (Count == )
return string.Empty;
long maxKey = this.Max(k => k.Key);
return this[maxKey];
}
}
Dictionary实现先进先出代替Queue的更多相关文章
- 先进先出集合queue
先进先出集合queue Enqueue添加到集合最后 Dequeue移除集合第一个对象并返回
- C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...
- 泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<T>,Dictionary<Tkey,Tvalue>,SortedList<Tkey,Tvalue>,Queue<T>,Stack<T>等
泛型与非泛型集合类在C#程序中是非常重要的一个基础概念,这里列一个表来进行对比: 非泛型集合类 泛型集合类 描述 ArrayList List<T> 表示具有动态大小的对象数组 Hasht ...
- python队列Queue
Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...
- Python自动化运维之16、线程、进程、协程、queue队列
一.线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行 ...
- 34、锁问题与线程queue
上一篇随笔我们学了全局解释器锁,前面也学了互斥锁,今天学习一些与锁相关的点,例如递归锁,信号量,Event,还会学习我们已经很熟悉的队列,不过这次的队列是作为一个模块出现的. 一.同步锁 1.join ...
- python中的Queue(队列)详解
一.Queue简介 python中的队列分类可分为两种: 1.线程Queue,也就是普通的Queue 2.进程Queue,在多线程与多进程会介绍. Queue的种类: FIFO: Queue.Que ...
- linkin大话数据结构--Queue
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...
- 优先队列Priority Queue和堆Heap
对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...
随机推荐
- PLSQL创建Oracle定时任务
在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢?下面我简单介绍使用工具创建定时器的方法: 1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据 cr ...
- es简单打造站内搜索
最近挺忙的,在外出差,又同时干两个项目.白天一个晚上一个,特别是白天做的项目,马上就要上线了,在客户这里 三天两头开会,问题很多真的很想好好静下来怼代码,半夜做梦都能fix bugs~ 和客户交流真的 ...
- 我的 OneNote 入门心得
Microsoft OneNote 是老牌笔记类软件,在如今百花齐放的笔记类市场仍然有众多死忠粉的拥护,比如我.也试过其它笔记类软件,近年推出的 Notion 就不错,但仍然无法取代 OneNote ...
- 【开源】SpringBoot&Netty实现仿微信网页版项目更新
阅读本文约“2.3分钟” 项目更新啦!V1.3.0 还记得那个聊天室的小项目吗? SpringBoot 加 Netty 实现聊天室 没错,这次已经完整进行了版本的替换,酥酥聊天室! 基于原项目的改动, ...
- 详解Linux高效命令head、tail和cat
Linux中提供了多种命令和程序用于浏览文件.无论对于新手.普通用户.高级用户.开发人员还是管理员来说,与诸多文件打交道都是一项艰巨的任务.而如何做到高效更称得上是一门艺术. 今天就让我们来探讨几个最 ...
- js之正则的坑
首先给一个神奇的图: 我的反应,精分吧!一会儿true一会儿false的... 后来发现,把g去掉后就正常了,那这是为什么呢??lastIndex惹得鬼! 正文: lastIndex 全局正则表达是, ...
- 开源ERP-成功案例分析(3)
Odoo用户概要 关于Odoo全球的用户,我们来看一些数据: Odoo目前全球有300万使用者 Odoo系统上每天新创建的数据库超过1000个 Odoo和Word.Excel.PowerPoint一样 ...
- 解决GJson 获取web api数据出现Not a JsonObject问题
服务器端web api服务采用asp.net web api编写,对请求的数据序列化成Json格式的字符串进行传递. 客户端采用Java进行接收处理,处理采用GJson进行解析,出现Not a Jso ...
- WLST Hangs Up Because of Java VM ClassLoader Deadlock
APPLIES TO: Oracle WebLogic Server - Version 10.0 to 10.3.6Information in this document applies to a ...
- ListView展示不同布局需要注意的地方
尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8419010.html 我们在项目中经常需在一个listview中展示不一样的布局,我们可以在adapt ...