C#编程(四十九)----------队列
队列
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#编程(四十九)----------队列的更多相关文章
- C#高级编程四十九天----队列
队列 1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从还有一端移除. 2.长处 (1).能对集合进行顺序处理 ...
- Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)
0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...
- “全栈2019”Java第四十九章:重载与重写对比详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 第四十九个知识点:描述在IPsec和TLS后的基本想法
第四十九个知识点:描述在IPsec和TLS后的基本想法 网络安全协议(Internet Protocol Security,IPsec)和安全传输层协议(Transport Layer Securit ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之一(四十九)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Android项目实战(四十九):Andoird 7.0+相机适配
解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...
- 四十九、进程间通信——System V IPC 之消息队列
49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...
随机推荐
- 014_mac下的端口查看
一. 使用netstat去过滤listen效果不怎么理想. $ netstat -an|grep -i --color "listen" tcp6 0 0 ::1.5601 *.* ...
- [原创]Sql2008 使用TVP批量插入数据
TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...
- 再谈CentOS 7程序自启动
上次发现了/etc/init.d下已经没有启动脚本了,然后对于启动乱序自己在rc.local中重排. 其实想一想这些应用的自启动终归还是需要通过脚本来执行的. 一.脚本在哪里? /usr/lib/sy ...
- 20165330《网络对抗技术》Exp0 Kali安装
Kali安装 下载地址 Kali官网 VMware 安装步骤 参考在虚拟机中安装kali linux 安装Kali Linux的镜像和VMware 打开VMware,选择文件-新建虚拟机,出现对话框选 ...
- .NetCore下使用Prometheus实现系统监控和警报 (一)介绍【译】
[译]原文https://prometheus.io/docs/introduction/overview 什么是Prometheus? Prometheus是一个开源系统监控和警报工具包,最初起源于 ...
- 项目通过https访问的tomcat相关配置
开发项目已经完成,那么就是要部署项目到服务器上面.我最近把刚完成的项目部署到服务器上面,内网通过http协议进行访问一切正常,但是测试外网通过https协议进行访问的时候就出现了一些js文档找不到的b ...
- Qwidget+opencv显示图像
步骤 1. 设置opencv库路径 在.pro文件中添加 INCLUDEPATH += D:/opencv/OpencvMingw/opencv310/include LIBS += D:/openc ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- P2817 宋荣子的城堡
P2817 宋荣子的城堡一道找规律的题,现在深入追究发现了有趣的东西.1 12 23 94 64显然k^(k-1) 在日照的时候也推出来了.3 9今天推错了,要列出所有的情况,然后再选,否则会漏掉.答 ...
- 006.LVM快照
一 快照介绍 快照就是将当时的系统信息记录下来,就好像照相一样,未来若有任何资料变动了,则原始资料会被移动到快照区,没有被改动的区域则由快照区与档案系统共享. 二 快照原理 当建立快照区时,LVM会预 ...