【问题标题】:Reverse a Queue反转队列
【发布时间】:2012-03-11 23:55:17
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net queue reverse enumerator


    【解决方案1】:

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

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

    【讨论】:

    • 啊,我真傻。我想我很困惑,因为当在列表上调用 Reverse 时,它​​会修改原始内容(因为 Reverse 不是 List 的扩展方法)。谢谢:)
    【解决方案2】:

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

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

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

    您可以像这样创建一个与现有队列相反的新队列:

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

    【讨论】:

    • 上次查的时候是LINQ方法。 :)
    • @M.Babcock - 好的,这是一个 Linq 方法和一个查询运算符。
    【解决方案3】:

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

    这是 MSDN 在代码中所说的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多