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的更多相关文章

  1. 先进先出集合queue

    先进先出集合queue Enqueue添加到集合最后 Dequeue移除集合第一个对象并返回

  2. C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)

    我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...

  3. 泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<T>,Dictionary<Tkey,Tvalue>,SortedList<Tkey,Tvalue>,Queue<T>,Stack<T>等

    泛型与非泛型集合类在C#程序中是非常重要的一个基础概念,这里列一个表来进行对比: 非泛型集合类 泛型集合类 描述 ArrayList List<T> 表示具有动态大小的对象数组 Hasht ...

  4. python队列Queue

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  5. Python自动化运维之16、线程、进程、协程、queue队列

    一.线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行 ...

  6. 34、锁问题与线程queue

    上一篇随笔我们学了全局解释器锁,前面也学了互斥锁,今天学习一些与锁相关的点,例如递归锁,信号量,Event,还会学习我们已经很熟悉的队列,不过这次的队列是作为一个模块出现的. 一.同步锁 1.join ...

  7. python中的Queue(队列)详解

    一.Queue简介 python中的队列分类可分为两种: 1.线程Queue,也就是普通的Queue 2.进程Queue,在多线程与多进程会介绍. Queue的种类: FIFO:  Queue.Que ...

  8. linkin大话数据结构--Queue

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...

  9. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

随机推荐

  1. [十六]JavaIO之InputStreamReader 与 OutputStreamWriter

      简介 InputStreamReader OutputStreamWriter是转换流 InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流. OutputStre ...

  2. AppBoxFuture(三): 分而治之

      系统数据量达到一定程度后必将采用分库分表的方式来提高系统性能,但传统的分库分表方式也必将带来更高的开发复杂程度.新一代的NewSql及NoSql数据库由于天生的分布式存储基因,既保证了能够横向扩展 ...

  3. Centos 7.0 zabbix 部署

    1.LAMP 环境搭建 初次安装可以先关闭selinux 和 firewall [root@localhost ~]# setenforce [root@localhost ~]# systemctl ...

  4. JavaScript小实例:拖拽应用(二)

    经常在网站别人的网站的注册页中看到一个拖拽验证的效果,就是它的验证码刚开始不出来,而是有一个拖拽的条,你必须将这个拖拽条拖到底,验证码才出来,说了感觉跟没说一样,你还是不理解,好吧,我给个图你看看: ...

  5. excel 函数1

    1 函数的相对引用和绝对引用 1.1绝对引用,相对引用和混合引用 按住F4键可以相互切换 1.2 if and or函数 案例图片 =IF(C7>30000,"大商家",&q ...

  6. Windows中nvm使用

    介绍:在两个项目且使用的node版本不一样时,维护多个版本的node, 安装:下载安装目录:https://github.com/coreybutler/nvm-windows/releasesnvm ...

  7. 【AO笔记】Addins的Toolbar 添加一条分割线

    在XAML中,给Item标签添加separator属性,需要从哪里打分割线,就将其设置为true即可.如下图所示: 如紫色框住的灰色竖线所示. 默认separator属性是false的,这个小东西极其 ...

  8. zabbix server3.4 使用mailx配置邮件报警

    软件具体配置如下: 操作系统:Centos7.5 zabbix server版本:zabbix server3.4 zabbix agent版本:zabbix agent3.0 现在开始配置zabbi ...

  9. 总结:当静态路由和BGP同时存在时路由优选BGP的两种方法

    结论: 方法一.配置BGP协议的外部优先级比静态路由的优先级高,优选BGP. 优点:配置简单. 缺点:全局生效,如果用户有针对某个静态路由想提高优先级,不受动态路由影响,则针对每个静态路由都需要人为提 ...

  10. 微信小程序 从含有tabbar的页面跳转到不含有tabbar的页面

    如何离开含有tabbar的页面 在微信小程序开发过程中,我们会碰到从某页跳转到一个含有tabbar的页面的需求, 用 wx.navigateTo({url: '...',})  不起作用,需要使用 w ...