反转队列

时间:2012-03-11 23:55:18

标签: c# .net queue reverse enumerator

我正在使用扩展名menthod Reverse(),但它似乎没有做任何事情。 MSDN声明它是作为延迟执行实现的,但我似乎无法使其工作。

以下是我的称呼方式。

        Queue<T> currentPath = new Queue<T>();
        currentPath.Enqueue(someValue);
        currentPath.Enqueue(someValue2);

        currentPath.Reverse();

这就是MSDN所说的:

  

此方法通过使用延迟执行来实现。立即返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用其GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each来枚举对象之前,不会执行此方法表示的查询。

我不确定调用GetEnumerator意味着什么。我只是通过简单地执行以下操作而尝试了这一点:

currentPath.Reverse();
currentPath.GetEnumerator();

我觉得我在这里做的事很傻,任何帮助都会受到赞赏!

3 个答案:

答案 0 :(得分:14)

反向返回相反的顺序。它不会修改原件。尝试这样的事情,从反向项目中构建一个新的队列:

currentPath = new Queue<T>(currentPath.Reverse());

当文档讨论调用GetEnumerator时,它意味着在Reverse()返回的IEnumerable上:

IEnumerable reversed = currentPath.Reverse();
IEnumerator reversedEnumerator = reversed.GetEnumerator();
// Now reversedEnumerator has assembled the reversed sequence,
// we could change the contents of currentPath and it wouldn't
// affect the order of items in reversedEnumerator.

当然,很少有人需要这样的枚举器,因为foreach将在我们的封面下为我们做这件事:

IEnumerable reversed = currentPath.Reverse();
foreach (var item in reversed)
{
    // ...
}

或者实际上,正如在我的第一个例子中,我们可以将反向可枚举传递给集合构造函数,例如QueueList,并让它执行迭代:

currentPath = new Queue<T>(currentPath.Reverse());

答案 1 :(得分:2)

Reverse()是Linq运算符。它用于操作您正在进行交互的序列。所以你可以做这样的事情:

foreach (var value in currentPath.Reverse())
{
     // Do something
}

这将以相反的顺序迭代队列中的项目。实际队列保持不变。

您可以创建一个新队列作为现有队列的反向,如下所示:

var newQueue = new Queue<T>(currentPath.Reverse());

答案 2 :(得分:1)

您是否尝试在调用Reverse()方法后迭代队列?

以下是MSDN在代码中所说的内容:

foreach (T item in currentPath.Reverse())
{
   // Do something with current item in queue.
}