队列

1.Queue定义

System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从另一端移除.

2.优点

(1).能对集合进行顺序处理(先进先出)

(2)能接受null值,并且允许重复的元素

3.Queue的构造器

构造器函数

注释

Queue()

初始化Queue类的新实例,该实例为空,具有默认初始容量(32)并使用默认增长因子(2.0)

Queue(ICollection)

初始化Queue类的新实例,该实例包含从指定集合复制的元素,具有与所复制的元素数相同的初始容量并使用默认增长因子

Queue(Int32)

初始化Queue类的新实例,该实例为空,具有指定的初始容量并使用默认增长因子

Queue(Int32,single)

初始化Queue类的新实例,该实例为空,具有指定的初始容量并使用指定的增长因子

4.Queue属性

属性名

注释

Count

获取Queue中包含的元素数

5.Queue的方法

方法名

注释

void Clear()

从Queue中移除所有对象

bool Contains(object obj)

确定某元素是否在Queue中

object Clone()

创建Queue的浅表副本

void CopyTo(Array array,int index)

从指定数组索引开始讲Queue元素复制到现有的以为Array中

object Dequeue()

移除并返回位于Queue开始处的对象

void Enqueue()

将对象添加到Queue的结尾处

object Peek()

返回位于Queue开始处的对象但不将其移除

object[]ToArray()

将Queue元素复制到新的数组

void TrimToSize()

将容量设置为Queue中元素的实际数目

6.Queue的使用案例

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 队列

{

class Program

{

static void Main(string[] args)

{

//创建一个队列

Queue myQ = new Queue();

myQ.Enqueue("The");//入队

myQ.Enqueue("quick");

myQ.Enqueue("brown");

myQ.Enqueue("fox");

myQ.Enqueue(null);//添加null

myQ.Enqueue("fox");//添加重复元素;

//打印队列的数量和值

Console.WriteLine("myQ");

Console.WriteLine("\tCount:     {0}",myQ.Count);

//打印队列中的所有值

Console.WriteLine("Queue Values");

PrintValues(myQ);

//打印队列中的第一个元素,并移除

Console.WriteLine("(Dequeue\t{0})", myQ.Dequeue());

//打印队列中的所有值

Console.WriteLine("Queue Values");

PrintValues(myQ);

//打印队列中的第一个元素

Console.WriteLine("(Peek)   \t{0}",myQ.Peek());

//打印队列中的所有值

Console.WriteLine("Queue Values");

PrintValues(myQ);

Console.ReadKey();

}

public static void PrintValues(IEnumerable myCollection)

{

foreach (object item in myCollection)

{

Console.WriteLine("    {0}",item);

}

Console.WriteLine();

}

}

}

7.备注

(1)Queue的容量是Queue可以保存的元素数.Queue的默认初始容量是32.箱Queue添加元素时,将通过重新分配来根据需要自动增大容量.可通过调用TrimToSize来减少容量.等比因子是当需要更大容量时当前容量要乘以的数字.在狗仔Queue时确定增长因子.默认增长因子为2.0.

(2)Queue能接受空引用作为有效值,并且允许重复的元素.

(3)空引用可以作为值添加到Queue.若要区分空值和Queue结尾,请检查Count属性或捕捉Queue为空时引发的InvalidOperationException异常.

案例:配合线程

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

/*

* 元素以先进先出的方式来处理的集合,第一个来,第一个走

* 例如:飞机登记排队,靠前的就先上飞机,不过队列有优先级

* 如同经济舱和商务舱的队,是两个不同的队,而商务舱优先

* 在.NEt技术中,using System.Collections.Generic.Queue<T>

* 是队列的泛型版本实现

* System.Collections.Queue是非泛型的实现,参数是object

* public class Queue<T>:IEnumerable<T>,ICollection,IEnumerable

* 从队列的定义可以看出,它实现了迭代,集合接口,他没有实现ICollection<T>这个接口,因为

* 其中定义的Add Remove方法会破坏队列

* 队列与列表的主要区别就是,队列没有实现IList接口

* 所以,不可以用索引器访问队列,队列只允许添加元素,

* 该元素只能放在队列的最后(Enqueue()),还有就是从头部去元素Dequeue()

* Enqueue从队列的后面插入元素,而Dequeue在取一个元素的同时,

* 会先将取出的元素删除,如再调用一次,就删除下一个元素

*

*

* 案例:使用一个线程将文档添加到队列中,

* 用另一个线程读取队列

* 存储队列的类型是Document,我们先定义了一个文档类

* 接着定义一个文档处理类DocumentManager,

* 其中包含了添加与读取方法,还有一个属性确定队列是不是为空

* 然后我们定义一个ProcessDocuments来处理线程,操作文档

*/

namespace 队列和线程

{

class Program

{

static void Main(string[] args)

{

DocumentManager mg = new DocumentManager();

ProcessDocuments process = new ProcessDocuments(mg);

//启动读取线程,不过现在没有内容,要等一会加入后,就能读到了

ProcessDocuments.Start(mg);

Document doc = null;

for (int i = 0; i < 500; i++)

{

doc = new Document("syx : " + i, "hello,I love You");

mg.AddDocument(doc);

//睡会,让给其他线程玩

Thread.Sleep(20);

}

Console.ReadKey();

}

}

/// <summary>

/// 文档类,描述类文档的标题与内容

/// </summary>

public class Document

{

public string title;

public string content;

public Document(string title, string content)

{

this.title = title;

this.content = content;

}

}

public class DocumentManager

{

//定义队列集合

private readonly Queue<Document> docQueue = new Queue<Document>();

//添加文档

public void AddDocument(Document doc)

{

//从队列一端插入内容

docQueue.Enqueue(doc);

Console.WriteLine("成功插入文档: {0} ",doc.title);

}

//读取文档

public Document GetDocument()

{

Document doc = null;

lock (this)

{

doc = docQueue.Dequeue();

return doc;

}

}

//只读属性,确定队列中是不是还有元素

public bool IsDocumentAvailable

{

get { return docQueue.Count > 0; }

}

}

//处理文档类

public class ProcessDocuments

{

private DocumentManager dm;

public ProcessDocuments(DocumentManager dm)

{

this.dm = dm;

}

public static void Start(DocumentManager manager)

{

//参数:public delegate void ThreadStart();

new Thread(new ProcessDocuments(manager).DoThreadFunc).Start();

}

public void DoThreadFunc()

{

while (true)

{

if (this.dm.IsDocumentAvailable)

{

Document doc = this.dm.GetDocument();

Console.WriteLine("从队列中读到读取并删除文档 标题:{0}   内容: {1}", doc.title, doc.content);

}

}

}

}

}

C#编程(四十九)----------队列的更多相关文章

  1. C#高级编程四十九天----队列

    队列 1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从还有一端移除. 2.长处 (1).能对集合进行顺序处理 ...

  2. Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  4. “全栈2019”Java第四十九章:重载与重写对比详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 第四十九个知识点:描述在IPsec和TLS后的基本想法

    第四十九个知识点:描述在IPsec和TLS后的基本想法 网络安全协议(Internet Protocol Security,IPsec)和安全传输层协议(Transport Layer Securit ...

  6. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之一(四十九)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  8. Android项目实战(四十九):Andoird 7.0+相机适配

    解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...

  9. 四十九、进程间通信——System V IPC 之消息队列

    49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...

随机推荐

  1. SQL Server 连接池 (ADO.NET) MSDN

    连接到数据库服务器通常由几个需要很长时间的步骤组成. 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前 ...

  2. Windows安装pycrypto失败记录

    Windows 10家庭中文版,Python 3.6.4, 180824测试前端加密文本在后台揭秘,查询后发现,可以使用pycrypto模块实现,那么,安装它(pip),结果安装失败了. 本文暂时记录 ...

  3. 使用android模拟器开发程序

    自从android studio升级到3.0之后自带的模拟器已经很好用了,尤其是升级后可以想vmware那样休眠,再次开启就可以快速启动了 以下是几点可以更方便地使用系统模拟器进行开发的小技巧,毕竟模 ...

  4. Servlet 3.0 新特性详解

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/#major3 Servlet 是 Java EE 规范体系的重要组成部分,也是 ...

  5. C# 数据库数据动态插入(反射)

    /// <summary> /// 提供将MySqlDataReader转成T类型的扩展方法 /// </summary> public static class MySqlD ...

  6. dojo 加载自定义module的路径问题

    因为最近想学学ArcGIS API for JavaScript ,翻了下ESRI的官网guide,发现其是基于dojo框架的,看了两页实在看不懂,于是先来熟悉下dojo框架.人蠢不能怪社会%> ...

  7. Qt_mingw搭建opencv开发环境

    Qt在windows下共有2个版本:mingw和msvc.其中mingw使用gcc编译器,msvc使用微软的VC编译器.针对不同版本Qt,使用Opencv的方式也不同. 区别 msvc, 可以使用op ...

  8. linux系统下创建lvm挂载到指定目录

    1 .背景 在企业中有时我们为方便安装软件.数据的管理,需要把安装软件.数据放到固定目录下,磁盘满了方便扩展,这里假如需要一个/data目录存放数据,并单独进行挂载. 2.操作步骤 2.1  划分磁盘 ...

  9. windows下解决PyCharm控制台中文输出乱码

    我用的PyCharm是2018.2版本 在调用os.system()的过程中遇到了控制台中文乱码的问题,具体如下 网上说的将两个Encoding格式都设置为UTF-8并没有解决问题,后来我将Proje ...

  10. 001.NTP简介

    一 NTP简介 ntp服务器顾名思义就是时间同步服务器(Network Time Protocol),时间同步对于计划备份.入侵检测记录.分布式任务调度或者事务订单管理来说都是非常有必要的日常任务. ...