Dictionary实现先进先出代替Queue

Posted datacool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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];
        }
    }

 

以上是关于Dictionary实现先进先出代替Queue的主要内容,如果未能解决你的问题,请参考以下文章

Python 线程优先级,出列顺序,先进先出,先进后出 代码实现

剑指Offer07-两个栈实现队列

队列Queue FIFO先进先出 栈Stack FILO先进后出

[py]py2自带Queue模块实现了3类队列

多线程利器-队列(queue)

数据结构14:队列(Queue),“先进先出”的数据结构