Как я могу вставить элементы в очередь в C # - PullRequest
8 голосов
/ 30 октября 2009

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

Ответы [ 6 ]

27 голосов
/ 30 октября 2009

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

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

15 голосов
/ 30 октября 2009

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

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

5 голосов
/ 04 января 2017

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

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);
2 голосов
/ 30 октября 2009

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

2 голосов
/ 30 октября 2009

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

0 голосов
/ 21 февраля 2018

Если вы хотите вставить в «середину» очереди, возможно, вы ищете «очередь с приоритетами».

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

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

Цитата из вопроса есть:

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

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

  • Вставка (Q, X). Получив элемент x с ключом k, вставьте его в очередь с приоритетами Q.
  • Найти-Minimum (Q). Вернуть указатель на элемент значение ключа которого меньше, чем у любого другого ключа в очереди с приоритетами Q.
  • Удалить-минимум (Q). Удалить элемент из очереди приоритетов Q, ключ которого минимум
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...