Есть ли способ получить последний элемент в очереди? - PullRequest
0 голосов
/ 07 декабря 2010

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

Ответы [ 5 ]

2 голосов
/ 07 декабря 2010

Вы можете просто сделать:

// Assumes T is a reference type, if it's a value type, then
// you will get an instance with the bits zeroed out.
T item = queue.LastOrDefault();

Проблема здесь в том, что каждый раз, когда вы хотите получить последний элемент в очереди, вы должны перебирать каждый элемент в очереди.

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

1 голос
/ 07 декабря 2010

Если вам действительно нужно, вы можете использовать это, но рассмотрите возможность использования другой структуры данных:

public static class QueueExtensions<T>
{
    const BindingFlags _flags = 
        BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance;

    private static readonly FieldInfo _array =
        typeof(Queue<T>).GetField("_array", _flags);

    private static readonly FieldInfo _size = 
        typeof(Queue<T>).GetField("_size", _flags);

    public T LastItem(this Queue<T> value)
    {
        if (value == null) 
            throw new ArgumentNullException("value");
        if (value.Count == 0) 
            throw new ArgumentException("The queue cannot be empty.", "value");
        var array = (T[])_array.GetValue(value);
        var size = (int)_size.GetValue(value);
        return array[size - 1];
    }
}
0 голосов
/ 07 декабря 2010

Нет, вам придется преобразовать очередь в какую-то другую коллекцию (используя ToList или ToArray), чтобы сделать это. Это эффективно исключило бы все из очереди.

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

0 голосов
/ 07 декабря 2010

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

Если вы импортируете System.Linq, вы можете написать: myQueue.Last()

0 голосов
/ 07 декабря 2010

Вы можете использовать Enumerable.Last() метод LINQ (где myQueue - это название вашей очереди):

var lastElement = myQueue.Last();

Хотя, как уже упоминали другие, если вам понадобитсячтобы делать это часто, вы, вероятно, захотите подумать об использовании другой структуры данных.Например, List<T>:

var myElement = myList[myList.Length - 1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...