队列

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. CentOS 6 安装chromium

    由于centos 6对C++11支持不足的缘故,目前chromium已经不再支持CentOS 6系列. 这里介绍如何在centos 6系列安装chromium. 1.添加chromium源 cd /e ...

  2. C/C++有效对齐值的确定

    先来看看什么是对齐.现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...

  3. IDEA / WebStorm / PhpStorm 添加jQuery自动提示,自动补全,提醒文档

    应该是JetBrains系列IDE通用的方法,网上其他一些方法有的过时了,有的不全 默认情况下没有JQuery补全,按照以下方法添加 1. 打开Settings,Languages & Fra ...

  4. NET 架构指南频道

    NET 架构指南频道 微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软 ...

  5. SSH Secure Shell Client安装和使用

    SSH是一个用来替代TELNET.FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题.为了系统安全和用户自身的 权益,推广SSH是必要的. SSH是英文Secure Shell的简写形式. ...

  6. Android-多进程初识

    Android-多进程初识 学习自 <Android开发艺术探索> https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503?fr=al ...

  7. InvokeRepeating重复定时器

    JS // Starting in 2 seconds.// a projectile will be launched every 0.3 secondsvar projectile : Rigid ...

  8. python 将字符串转换成字典dict的各种方式总结

    1)利用eval可以将字典格式的字符串与字典户转 >>>mstr = '{"name":"yct","age":10}' ...

  9. Ⅳ.Catalan数

    Catalan数首先是由Euler在精确计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,它经常出现在组合计数问题中.     问题的提出:在一个凸n边形中,通过不相交于n边形内部的对角线,把n ...

  10. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...