Queue<T>.GetEnumerator Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает перечислитель, который выполняет итерацию через Queue<T>.
public:
System::Collections::Generic::Queue<T>::Enumerator GetEnumerator();
public System.Collections.Generic.Queue<T>.Enumerator GetEnumerator();
member this.GetEnumerator : unit -> System.Collections.Generic.Queue<'T>.Enumerator
Public Function GetEnumerator () As Queue(Of T).Enumerator
Возвращаемое значение
Queue<T>Для Queue<T>.Enumerator .
Примеры
В следующем примере кода показано, что Queue<T> универсальный класс можно перечислить. Оператор foreach (For Each в Visual Basic) используется для перечисления очереди.
В примере кода создается очередь строк с емкостью по умолчанию и используется Enqueue метод для очереди пяти строк. Перечисляются элементы очереди, которые не изменяют состояние очереди. Метод Dequeue используется для отмены первой строки. Метод Peek используется для просмотра следующего элемента в очереди, а затем Dequeue используется для его отмены.
Метод ToArray используется для создания массива и копирования элементов очереди, затем массив передается Queue<T> конструктору, который принимает IEnumerable<T>, создавая копию очереди. Отображаются элементы копии.
Массив в два раза больше размера очереди создается, а CopyTo метод используется для копирования элементов массива, начиная с середины массива. Конструктор Queue<T> снова используется для создания второй копии очереди, содержащей три элемента NULL в начале.
Метод Contains используется для отображения того, что строка "четыре" находится в первой копии очереди, после чего Clear метод очищает копию, а Count свойство показывает, что очередь пуста.
using System;
using System.Collections.Generic;
class Example
{
public static void Main()
{
Queue<string> numbers = new Queue<string>();
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<T>.
Queue<string> queueCopy = new Queue<string>(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).
Queue<string> queueCopy2 = new Queue<string>(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 first 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
*/
open System
open System.Collections.Generic
let numbers = Queue()
numbers.Enqueue "one"
numbers.Enqueue "two"
numbers.Enqueue "three"
numbers.Enqueue "four"
numbers.Enqueue "five"
// A queue can be enumerated without disturbing its contents.
for number in numbers do
printfn $"{number}"
printfn $"\nDequeuing '{numbers.Dequeue()}'"
printfn $"Peek at next item to dequeue: {numbers.Peek()}"
printfn $"Dequeuing '{numbers.Dequeue()}'"
// Create a copy of the queue, using the ToArray method and the
// constructor that accepts an IEnumerable<T>.
let queueCopy = numbers.ToArray() |> Queue
printfn $"\nContents of the first copy:"
for number in queueCopy do
printfn $"{number}"
// Create an array twice the size of the queue and copy the
// elements of the queue, starting at the middle of the
// array.
let array2 = numbers.Count * 2 |> Array.zeroCreate
numbers.CopyTo(array2, numbers.Count)
// Create a second queue, using the constructor that accepts an
// IEnumerable(Of T).
let queueCopy2 = Queue array2
printfn $"\nContents of the second copy, with duplicates and nulls:"
for number in queueCopy2 do
printfn $"{number}"
printfn $"""\nqueueCopy.Contains "four" = {queueCopy.Contains "four"}"""
printfn $"\nqueueCopy.Clear()"
queueCopy.Clear()
printfn $"queueCopy.Count = {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 first 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
Imports System.Collections.Generic
Module Example
Sub Main
Dim numbers As New Queue(Of String)
numbers.Enqueue("one")
numbers.Enqueue("two")
numbers.Enqueue("three")
numbers.Enqueue("four")
numbers.Enqueue("five")
' A queue can be enumerated without disturbing its contents.
For Each number As String In numbers
Console.WriteLine(number)
Next
Console.WriteLine(vbLf & "Dequeuing '{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(Of T).
Dim queueCopy As New Queue(Of String)(numbers.ToArray())
Console.WriteLine(vbLf & "Contents of the first copy:")
For Each number As String In queueCopy
Console.WriteLine(number)
Next
' Create an array twice the size of the queue, compensating
' for the fact that Visual Basic allocates an extra array
' element. Copy the elements of the queue, starting at the
' middle of the array.
Dim array2((numbers.Count * 2) - 1) As String
numbers.CopyTo(array2, numbers.Count)
' Create a second queue, using the constructor that accepts an
' IEnumerable(Of T).
Dim queueCopy2 As New Queue(Of String)(array2)
Console.WriteLine(vbLf & _
"Contents of the second copy, with duplicates and nulls:")
For Each number As String In queueCopy2
Console.WriteLine(number)
Next
Console.WriteLine(vbLf & "queueCopy.Contains(""four"") = {0}", _
queueCopy.Contains("four"))
Console.WriteLine(vbLf & "queueCopy.Clear()")
queueCopy.Clear()
Console.WriteLine(vbLf & "queueCopy.Count = {0}", _
queueCopy.Count)
End Sub
End Module
' 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
Комментарии
Оператор foreach языка C# (For Each в Visual Basic) скрывает сложность перечислителей. Поэтому рекомендуется использовать foreach вместо непосредственного управления перечислителем.
Перечислители можно использовать для чтения данных в коллекции, но их нельзя использовать для изменения базовой коллекции.
Изначально перечислитель размещается перед первым элементом в коллекции. На этой позиции Current не определен. Поэтому перед чтением значения Currentнеобходимо вызвать MoveNext перечислитель к первому элементу коллекции.
Current возвращает тот же объект до MoveNext вызова. MoveNext задает Current для следующего элемента.
Если MoveNext передает конец коллекции, перечислитель размещается после последнего элемента в коллекции и MoveNext возвращается false. Если перечислитель находится в этой позиции, последующие вызовы MoveNext также возвращаются false. Если последний вызов MoveNext возвращен false, Current не определен. Нельзя снова задать Current первый элемент коллекции. Вместо этого необходимо создать новый экземпляр перечислителя.
Перечислитель остается допустимым, пока коллекция остается неизменной. Если изменения вносятся в коллекцию, например добавление, изменение или удаление элементов, перечислитель неустранимо недопустим, а следующий вызов MoveNext или вызов вызывает InvalidOperationExceptionисключениеIEnumerator.Reset.
Перечислитель не имеет монопольного доступа к коллекции; Таким образом, перечисление через коллекцию по сути не является потокобезопасной процедурой. Чтобы гарантировать безопасность потоков во время перечисления, можно заблокировать коллекцию во время всего перечисления. Чтобы разрешить доступ к коллекции несколькими потоками для чтения и записи, необходимо реализовать собственную синхронизацию.
Реализации коллекций по умолчанию не System.Collections.Generic синхронизируются.
Этот метод является операцией O(1).