A Queue представляет собой коллекцию First-In-First-Out (FIFO) (это прямо сказано в документации). Это означает, что перечисление предоставляет вам элементы в том порядке, в котором они были добавлены.
A Stack - коллекция Last-In-First-Out (LIFO). Это означает, что перечислитель предоставляет вам элементы в обратном порядке того, как они были добавлены.
Стеки и очереди представляют собой очень стандартную конструкцию компьютерных наук, поэтому они действительно не могут быть переназначены без серьезной реакции.Когда вы смотрите на примеры для GetEnumerator()
функций, это ясно указывает порядок перечисления:
Stack Enumeration:
Stack<string> numbers = new Stack<string>();
numbers.Push("one");
numbers.Push("two");
numbers.Push("three");
numbers.Push("four");
numbers.Push("five");
// A stack can be enumerated without disturbing its contents.
foreach(string number in numbers)
{
Console.WriteLine(number);
}
/* This code example produces the following output:
five
four
three
two
one
*/
Queue Enumeration:
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);
}
/* This code example produces the following output:
one
two
three
four
five
*/
Опять же, с основными определениями информатики, счетчику или итератор должен представить элементы в естественном порядке для коллекции. Конкретные типы сбора имеют определенный порядок.
Caveat
Пожалуйста, обратите внимание, что в то время как процесс перечисления действительно отражает естественный порядок коллекций ФИФО и ЛИФО (ref), это не так, как Очереди (ref) и стеки (ref) являются предназначены быть использованным. Они предназначены для использования с взаимодействиями Enqueue()
/Dequeue()
и Push()
/Pop()
/Peek()
. Microsoft включает в себя перечислитель, чтобы все было согласовано с базовым интерфейсом ICollection<T>
и сохраняло нумерацию в естественном порядке коллекции.
Целью очереди является создание конвейера работы, который может быть обработан в порядке. Целью стека является предоставление способа возврата к предыдущему контексту, когда выполняется локальная работа. Они предназначены для работы по одному предмету одновременно. Итерирование по коллекции с помощью перечисляющего вида боковых шагов, целиком и не удаляющих элементы из очереди/стека. Это, по сути, взгляд на все предметы, которые есть.
Вы сравниваете разные вещи. Стеки, очереди, массивы, списки имеют сильную гарантию заказа, в то время как словарь не имеет. Вы столкнулись с определенной проблемой? –
Я нашел [очень похожий вопрос] (http://stackoverflow.com/questions/2628048/stack-tolist-in-net-order-of-elements) –
@PanagiotisKanavos Нет, я этого не делал. Но это не имеет значения. Честно говоря, в течение нескольких лет вы, молодежь, я использовал перечисление «Словарь», и код был построен так, чтобы он зависел от порядка перечисления, и это было ужасно. Я никогда не спотыкался о случае, когда «Словарь» меняет порядок перечисления. Это не делает ошибку более ужасной. –