5

我正在使用扩展方法 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();

我觉得我在这里做的事情很愚蠢,任何帮助将不胜感激!

4

3 回答 3

17

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

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)
{
    // ...
}

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

currentPath = new Queue<T>(currentPath.Reverse());
于 2012-03-11T23:58:55.233 回答
2

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

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

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

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

var newQueue = new Queue<T>(currentPath.Reverse());
于 2012-03-11T23:59:41.650 回答
1

您是否尝试在调用该方法后遍历队列Reverse()

这是 MSDN 在代码中所说的:

foreach (T item in currentPath.Reverse())
{
   // Do something with current item in queue.
}
于 2012-03-12T00:00:46.317 回答