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. 【Axios】前端页面使用axios调用后台接口

    项目基本情况 前端项目是用vue.js做的,前端起的服务URL:http://localhost:8080/ 后端项目是用Node.js做的,后端起的服务URL:http://localhost:30 ...

  2. SpringBoot基础系列-SpringBoot配置

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9990680.html SpringBoot基础系列-SpringBoot配置 概述 属性 ...

  3. SpringBoot整合系列-整合Swagger2

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9959844.html SpringBoot整合Swagger2 步骤 第一步:添加必要的 ...

  4. mybatis和hibernate的区别

    1. hibernate是全自动,而mybatis是半自动 hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql.而mybat ...

  5. Python3+Selenium2完整的自动化测试实现之旅(六):Python单元测试模块Unittest运用

    一.Unittest单元测试框架简介 Unitest是Python下的一个单元测试模块,是Python标准库模块之一,安装完Python后就可以直接import该模块,能在单元测试下编写具体的测试用例 ...

  6. c# IO操作

    今天我们主要讨论的IO的一些操作,首先我们先引入三个变量: /// <summary> /// 配置绝对路径 /// </summary> private static str ...

  7. VBA中使用正则的两种方式

    第一种方式(需要引用VBScript RegularExpression 5.5类库) Option Explicit Sub RegularExpresstion()'方法块 Dim regex A ...

  8. 批量修改mac系统文件的可读写权限

    www 修改 /Users/feiwang 文件夹下的www 下的所有文件和文件的可读写权限.

  9. [MySQL] mysql 的行级显式锁定和悲观锁

    隐式和显式锁定:1.innodb是两阶段锁定协议,隐式锁定比如在事务的执行过程中.会进行锁定,锁只有在commit或rollback的时候,才会同时被释放2.特定的语句进行显式锁定 select .. ...

  10. nth-child(n)和nth-of-type(n)的区别

    1.官方解释: p:nth-child(2)     选择属于其父元素的第二个子元素的每个 <p> 元素. p:nth-of-type(2) 选择属于其父元素第二个 <p> 元 ...