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 ...
随机推荐
- vue webpack打包背景图片
vue的背景图 和 img标签图大于10KB都不会转成base64处理,可以设置limit(不推荐),所以要设置一个公共路径,解决办法如下
- sql删除数据库重复字段的行
要保留的数据: WITH summary AS ( SELECT p.id, p.customer, p.total, ROW_NUMBER() OVER(PARTITION BY p.custome ...
- 杭电ACM2006--求奇数的乘积
求奇数的乘积 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- es6 Symbol类型
es6 新增了一个原始类型Symbol,代表独一无二的数据 javascript 原来有6中基本类型, Boolean ,String ,Object,Number, null , undefined ...
- Selenium自动化-CSS元素定位
接下来,开始讲解 CSS元素定位. CSS定位速度快,功能多,但是不能向上查找,比 xpath好用,是本人认为最好用的定位方式 大致用法总结: 具体使用仿上篇博客.http://www.cnblo ...
- 一种提升连接Dynamics 365性能的方法
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复256或者20170512可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- 开源项目商业分析实例(1) - MonicaHQ
本来写一篇开源商业模式的稿子,因为有四大主题,这个稿子有点大,导致现在半个月过去了,都还没有憋出来. 今天想想还是采用MVP(minimum viable product,最小化可行产品)模式吧. ...
- 总结:当静态路由和BGP同时存在时路由优选BGP的两种方法
结论: 方法一.配置BGP协议的外部优先级比静态路由的优先级高,优选BGP. 优点:配置简单. 缺点:全局生效,如果用户有针对某个静态路由想提高优先级,不受动态路由影响,则针对每个静态路由都需要人为提 ...
- IDEA修改Git账户和密码
找到c盘中git目录的.gitconfig文件可以直接修改name和邮箱
- TreeView 节点拖拽
public Form1() { InitializeComponent(); treeView1.AllowDrop = true; treeView1.ItemDrag += new ItemDr ...