Подтвердить что ты не робот

Выбор конкретного объекта в очереди (например, peek +1)

если Peek возвращает следующий объект в очереди, есть ли метод, который я могу использовать для получения определенного объекта? Например, я хочу найти третий объект в очереди и изменить одно из его значений?

прямо сейчас Я просто делаю foreach через очередь, которая может быть лучшим решением, но я не знал, есть ли что-то особенное, которое вы можете использовать с peek? т.е. Queue.Peek(2)

4b9b3361

Ответ 1

Если вы хотите напрямую обращаться к элементам (с операцией O(1)), используйте массив вместо очереди, потому что очередь имеет другую функцию (FIFO).

Операция с произвольным доступом в очереди будет O(n), потому что ей необходимо перебирать каждый элемент в коллекции... что в свою очередь делает ее последовательным доступом, а не прямым случайным доступом.


Опять же, поскольку вы используете С#, вы можете использовать queue.ElementAt(n) из System.Linq (так как Queue реализует IEnumerable), но это не будет O(1), т.е. оно все равно будет перебирать элементы.

Ответ 2

Хотя это все еще O (n), его, конечно, легче читать, если вы используете методы расширения LINQ ElementAt() или ElementAtOrDefault(), это расширения IEnumerable<T>, которые реализуется Queue<T>.

using System.Linq;

Queue<T> queue = new Queue<T>();
T result; 
result = queue.ElementAt(2);
result = queue.ElementAtOrDefault(2);

Edit Если вы переходите к другим предложениям конвертации вашей очереди в массив только для этой операции, вам нужно решить, оправдывают ли вероятные размеры вашей очереди и расстояние от индекса, который вы ищете от начала очереди O (n) операции вызова. ToArray(). ElementAt (м), не говоря уже о требованиях к пространству для создания для него дополнительного места хранения.

Ответ 3

для очереди через очередь. Вид парадокса.

Однако, если вы можете foreach, это IEnumerable, поэтому обычные расширения linq применяются:

queue.Skip(1).FirstOrDefault()

или

queue.ElementAt(1)

Ответ 4

Вы можете сделать что-то вроде этого как одно:

object thirdObjectInQueue = queue.ToArray()[2];

Я бы не рекомендовал использовать его много, однако, поскольку он копирует всю очередь в массив, тем самым итерации по всей очереди.