我正在使用扩展名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();
我觉得我在这里做的事很傻,任何帮助都会受到赞赏!
答案 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)
{
// ...
}
或者实际上,正如在我的第一个例子中,我们可以将反向可枚举传递给集合构造函数,例如Queue
或List
,并让它执行迭代:
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.
}