反转队列

Ben*_*ino 4 .net c# queue reverse enumerator

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

我就是这样称呼的.

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

        currentPath.Reverse();
Run Code Online (Sandbox Code Playgroud)

这就是MSDN所说的:

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

我不确定调用GetEnumerator意味着什么.我试过这个,只是做了以下无济于事:

currentPath.Reverse();
currentPath.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

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

Wee*_*ble 16

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

currentPath = new Queue<T>(currentPath.Reverse());
Run Code Online (Sandbox Code Playgroud)

当文档讨论调用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.
Run Code Online (Sandbox Code Playgroud)

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

IEnumerable reversed = currentPath.Reverse();
foreach (var item in reversed)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

currentPath = new Queue<T>(currentPath.Reverse());
Run Code Online (Sandbox Code Playgroud)