标签:部分 nbsp add ret enqueue win 素数 元素 middle
假设调用Dequeue()时,队列中没有元素就会抛出异常InvalidOperationException异常。
Peek(): 在队列的头部取出一个元素,但不删除它。
TrimExcess():重置队列的容量。 /******************************************************************************************************************************/ 经常使用Queue<T>类的成员函数的源代码例如以下: public T Dequeue() { if (this._size == 0) { ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyQueue); } T local = this._array[this._head]; this._array[this._head] = default(T); this._head = (this._head + 1) % this._array.Length; this._size--; this._version++; return local; } public void Enqueue(T item) { if (this._size == this._array.Length) { int capacity = (int) ((this._array.Length * 200L) / 100L); if (capacity < (this._array.Length + 4)) { capacity = this._array.Length + 4; } this.SetCapacity(capacity); } this._array[this._tail] = item; this._tail = (this._tail + 1) % this._array.Length; this._size++; this._version++; } public T Peek() { if (this._size == 0) { ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyQueue); } return this._array[this._head]; } public void TrimExcess() { int num = (int) (this._array.Length * 0.9); if (this._size < num) { this.SetCapacity(this._size); } } 上诉方法使用到的SetCapacity函数的源代码例如以下: private void SetCapacity(int capacity) { T[] destinationArray = new T[capacity]; if (this._size > 0) { if (this._head < this._tail) { Array.Copy(this._array, this._head, destinationArray, 0, this._size); } else { Array.Copy(this._array, this._head, destinationArray, 0, this._array.Length - this._head); Array.Copy(this._array, 0, destinationArray, this._array.Length - this._head, this._tail); } } this._array = destinationArray; this._head = 0; this._tail = (this._size == capacity) ? 0 : this._size; this._version++; } /*****************************************************************************************************************************************/ 演示样例: 以下的代码演示样例演示了 Queue<T> 泛型类的几个方法。
此代码演示样例创建一个具有默认容量的字符串队列,并使用 Enqueue 方法对五个字符串进行排队。 枚举队列元素,这不会更改队列的状态。 使用 Dequeue 方法使第一个字符串出列。 使用 Peek 方法查找队列中的下一项。然后使用 Dequeue 方法使该项出列。
使用 ToArray 方法创建一个数组并将队列元素拷贝到该数组,然后将该数组传递给接受 IEnumerable 的 Queue 构造函数以创建队列副本。 将显示副本的元素。 创建一个大小是队列大小两倍的数组,并使用 CopyTo 方法从数组中间開始复制数组元素。 再次使用 Queue1T> 构造函数创建第二个队列副本,此队列在開始处包括三个 null 元素。 使用 Contains 方法显示字符串“four”在第一个队列副本中。然后使用 Clear 方法清除此副本并由 Count 属性显示该队列为空。using System; using System.Collections.Generic; class Example { public static void Main() { Queue1string> numbers = new Queue1string>(); numbers.Enqueue("one"); numbers.Enqueue("two"); numbers.Enqueue("three"); numbers.Enqueue("four"); numbers.Enqueue("five"); // A queue can be enumerated without disturbing its contents. foreach( string number in numbers ) { Console.WriteLine(number); } Console.WriteLine("\nDequeuing ‘{0}‘", numbers.Dequeue()); Console.WriteLine("Peek at next item to dequeue: {0}", numbers.Peek()); Console.WriteLine("Dequeuing ‘{0}‘", numbers.Dequeue()); // Create a copy of the queue, using the ToArray method and the // constructor that accepts an IEnumerable. Queue1string> queueCopy = new Queue1string>(numbers.ToArray()); Console.WriteLine("\nContents of the first copy:"); foreach( string number in queueCopy ) { Console.WriteLine(number); } // Create an array twice the size of the queue and copy the // elements of the queue, starting at the middle of the // array. string[] array2 = new string[numbers.Count * 2]; numbers.CopyTo(array2, numbers.Count); // Create a second queue, using the constructor that accepts an // IEnumerable(Of T). Queue1string> queueCopy2 = new Queue1string>(array2); Console.WriteLine("\nContents of the second copy, with duplicates and nulls:"); foreach( string number in queueCopy2 ) { Console.WriteLine(number); } Console.WriteLine("\nqueueCopy.Contains(\"four\") = {0}", queueCopy.Contains("four")); Console.WriteLine("\nqueueCopy.Clear()"); queueCopy.Clear(); Console.WriteLine("\nqueueCopy.Count = {0}", queueCopy.Count); } } /* This code example produces the following output: one two three four five Dequeuing ‘one‘ Peek at next item to dequeue: two Dequeuing ‘two‘ Contents of the copy: three four five Contents of the second copy, with duplicates and nulls: three four five queueCopy.Contains("four") = True queueCopy.Clear() queueCopy.Count = 0 */
C#中Queue<T>类的使用以及部分方法的源代码分析
标签:部分 nbsp add ret enqueue win 素数 元素 middle
原文地址:http://www.cnblogs.com/brucemengbm/p/6817391.html