Как вставить элементы в очередь в 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, чей ключ минимален