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 引入了三种高级进程间通信机制 消息 ...
随机推荐
- Redis Scan命令
原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...
- SSH(Struts、Spring、Hibernate)三大框架整合
1. 新建数据库ssh_db -> 新建表user_tb(id为主键,自动递增) 2. 导入jar包(struts.hibernate 和 spring) 3. 注册页面reg.jsp,将表单的 ...
- java 标准异常
一.Throwable这个Java类被用来表示任何可以作为异常被抛出的类.Throwable对象可分为两种类型(从Throwable继承而得到的类型): 1.) Error用来表示编译时和系统错误 2 ...
- sysbench安装及性能测试
现在的压力测试工具各种各样,只要上手好几款功能强大点的而且比较大众化的压力测试工具即可,以下跟大家交流下sysbench的安装和压力测试 sysbench支持以下几种测试模式: 1.CPU运算性能 2 ...
- 如何用NAnt管理单文件程序仓库
因为学习C#各种特性和使用方法的需要,常常会编写和收集一些例子代码.一段时间之后,这种代码的数量就增加到无法通过简单粗暴的方式进行管理了.采用NAnt进行管理是一个不错的选择,虽然部分特性只有MSBu ...
- JS中的的"闭包"?深入Javascript之this
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- 【LOJ】#2535. 「CQOI2018」九连环
题解 简单分析一下,有\(k\)个环肯定是,我拆掉了\(k - 2\)个,留最左两个,1步拆掉最左的,这个时候我还要把这\(k - 2\)个环拼回去,拆一次\(k - 1\) 所以方案数就是\(f[k ...
- 【AtCoder】ARC101题解
C - Candles 题解 点燃的一定是连续的一段,枚举左端点即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #de ...
- 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
- ubantu下如何完全彻底卸载mysql(转)
ubantu下如何完全彻底卸载mysql https://blog.csdn.net/wszll_Alex/article/details/46277681 第1步 依次执行下面的语句 1 sud ...