有没有办法获取队列中的最后一个元素?

时间:2010-12-07 20:41:06

标签: .net data-structures queue

我知道堆栈是最好和最简单的方法,但是有可能获得队列中的最后一个元素而不必出列任何东西吗?

6 个答案:

答案 0 :(得分:2)

您可以这样做:

// 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();

这里的问题是,每次想要获取队列中的最后一项时,都必须遍历队列中的每个项。

如果您有权访问队列的第一个和最后一个元素,那么您可能需要考虑double-ended queue

答案 1 :(得分:1)

如果你真的需要,你可以使用它,但考虑使用不同的数据结构:

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];
    }
}

答案 2 :(得分:0)

您可以使用LINQ&#39; Enumerable.Last() method(其中myQueue是您的队列的名称):

var lastElement = myQueue.Last();

虽然正如其他人所提到的,如果你发现自己经常需要这样做,你可能想要考虑使用不同的数据结构。例如,List<T>

var myElement = myList[myList.Length - 1];

答案 3 :(得分:0)

不,您必须将队列转换为其他集合(使用ToListToArray)才能执行此操作。这将有效地使队列中的所有内容出列。

请记住,通过需要队列中的最后一项,您已经有效地证明您使用了错误的集合来保存数据。请考虑将您的集合更改为另一种类型,以提供您需要的所有操作。

答案 4 :(得分:0)

队列没有设置为快速执行该操作,因此您可以做的最好是O(n)。

如果您导入System.Linq,您可以写: myQueue.Last()

答案 5 :(得分:0)

对于 java 8 流,您可以执行以下操作:

queue.stream().reduce((first, second) -> second).get();