队列实现先进先出,有装箱拆箱行为,可存放任意类型,但无法获取指定位置元素,只能取出最先存储的元素。
一、基本队列操作
1、向队列添加元素(Enqueue)
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue("道,可道,非常道。");
queue.Enqueue(1.21);
queue.Enqueue("白马非马。");
queue.Enqueue(-5.68);
queue.Enqueue("事虽难,做则必成。");
2、获取队列长度(Count)
Console.WriteLine("队列长度:" + queue.Count);
3、队列遍历
if (queue != null && queue.Count > 0)
{
foreach (var item in queue)
{
Console.WriteLine(item);
}
}
4、读取取出(Peek)
Console.WriteLine("队列读取取出");
var value = queue.Peek();
Console.WriteLine(value);
5、删除取出(Dequeue)
Console.WriteLine("队列删除取出");
var value1 = queue.Dequeue();
Console.WriteLine(value1);
6、判断元素是否存在(Contains)
Console.WriteLine("判断队列中元素是否存在");
if (queue.Contains(1.21))
{
Console.WriteLine("队列中存在1.21");
}
7、清空队列(Clear)
Console.WriteLine("清空队列");
queue.Clear();
二、泛型类队列
1、示例
Queue<string> queue = new Queue<string>();
queue.Enqueue("远上寒山石径斜");
queue.Enqueue("白云深处有人家");
queue.Enqueue("停车坐爱枫林晚");
queue.Enqueue("霜叶红于二月花");
int count = queue.Count;
Console.WriteLine("队列元素数量:"+count);
bool b = queue.Contains("老六");
string res = b ? "队列中包括老六" : "队列中不包括老六";
Console.WriteLine(res);
Console.WriteLine("Peek测试");
string p = queue.Peek();
Console.WriteLine(p);
Console.WriteLine("Dequeue测试");
string d1 = queue.Dequeue();
Console.WriteLine(d1);
d1 = queue.Dequeue();
Console.WriteLine(d1);
Console.WriteLine("Clear测试");
queue.Clear();
Console.WriteLine(queue.Count);
2、运行结果
队列元素数量:4
队列中不包括老六
Peek测试
远上寒山石径斜
Dequeue测试
远上寒山石径斜
白云深处有人家
Clear测试
0
三、队列多线程操作
1、示例
static Queue<int> queueT = new Queue<int>();
static readonly object objLock = new object();
public const int THREAD_SUM = 5;
public static void QueueTest()
{
queueT.Clear();
for(int i = 0; i < 30; i++)
{
queueT.Enqueue(i);
}
var factory=new TaskFactory();
var tasks=new Task[THREAD_SUM];
for(int i=0;i < THREAD_SUM; i++)
{
Task task = tasks[i];
task = factory.StartNew(() =>
{
Timer timer = new Timer((o) =>
{
if (IsAvailable)
{
int q = Read();
Console.WriteLine($"线程{task.Id}读取值:{q}");
}
}, null, 500, 1000);
});
}
}
public static int Read()
{
int res = 0;
lock(objLock)
{
if(IsAvailable)
{
res=queueT.Dequeue();
}
return res;
}
}
public static bool IsAvailable
{
get { return queueT.Count > 0; }
}
2、运行结果
线程1读取值:0
线程3读取值:1
线程5读取值:2
线程4读取值:3
线程2读取值:4
线程3读取值:5
线程1读取值:6
线程4读取值:7
线程5读取值:8
线程2读取值:9
线程3读取值:10
线程1读取值:11
线程5读取值:12
线程4读取值:13
线程2读取值:14
线程3读取值:15
线程1读取值:16
线程5读取值:17
线程2读取值:19
线程4读取值:18
线程3读取值:23
线程5读取值:21
线程2读取值:22
线程1读取值:24
线程4读取值:20
线程5读取值:25
线程3读取值:28
线程1读取值:29
线程4读取值:26
线程2读取值:27
注意:线程号和数据的对应关系并不确定,但所有队列元素全部遍历到。