Как вставить элементы в очередь в C#

В C# я использую коллекцию очереди. Я могу запросто узнать или узнать. Хорошо, теперь я хотел бы вставить что-то в середине очереди или в начале очереди. Я не нахожу никакого способа сделать это. Что вы рекомендуете в качестве альтернативной коллекции?

6 ответов


очередь, по определению, является чем-то, к чему вы можете только запрашивать и dequeue вещи. Если вы хотите вставить посередине, то вам нужен полноценный список (возможно LinkedList<T>), а не Queue.

Я имею в виду, вы не будете пытаться "вставить" себя в середине очереди в супермаркете (я надеюсь); это работает так же здесь.


то, что вы ищете-это LinkedList<T>. Вы можете добавить в начало, середину (используя AddBefore или AddAfter) или конец списка.

это выгодно по сравнению с использованием List<T> потому что вы можете использовать RemoveFirst или RemoveLast, чтобы он более точно имитировал очередь или стек.


хотя ответы на этой странице верны, если вы находитесь в положении, когда вы не можете использовать что-то, кроме очереди, вы можете (с небольшим количеством накладных расходов) добавить элемент в середину очереди. Следует ли это делать или нет-совсем другая история.

var myQueue = new Queue<string>();
myQueue.Enqueue("item 0");
myQueue.Enqueue("item 10");

var myList = myQueue.ToList();
myList.Insert(1, "item 5");

myQueue = new Queue<string>(myList);

точкой очереди является предоставление абстракции интерфейса FIFO (first-in-first-out). Если вы хотите иметь возможность взаимодействовать со структурой данных без очереди, не используйте очередь.


вам, вероятно, придется использовать список.


Если вы хотите вставить в" середину " очереди, вы можете искать "очередь приоритетов".

к сожалению, это не встроенный класс .Net, AFAIK. Но, по крайней мере, теперь у вас есть название концепции, чтобы искать.

см. этот (закрытый) Q&A для некоторых, возможно, полезных ссылок:
очередь приоритетов в .Net

цитата из вопроса там:

приоритетные очереди-это структуры данных, которые обеспечивают большую гибкость чем простая сортировка, потому что они позволяют новым элементам входить в систему с произвольными интервалами. Гораздо более экономично вставлять новое задание в очередь приоритетов, чем заново сортировать все по каждому такому прибытию.

основная очередь приоритетов поддерживает три основные операции:

  • вставить(Q,x). Учитывая элемент x с ключом k, вставьте его в очередь приоритетов Q.
  • Найти-Минимум (Q). Возвращает указатель на элемент чье ключевое значение меньше любого другого ключа в очереди приоритетов Вопрос:
  • Удалить-Минимум (Q). Удалите элемент из очереди приоритетов Q, чей ключ минимален