2015-04-06 41 views
-2

我今天遇到了一个队列变量问题,我尝试读取并获取队列中的下一个对象。我正在使用遍历队列中所有对象的foreach循环。但我也想找出下一个对象的值,那就是我卡住的地方。这是我迄今完成的代码。获取队列中的下一个值

private static void outResult(Queue<OrderClass> orderQueue) 
    { 
     int week = 0; 
     int orderCount = 0; 
     bool last = false; 

     foreach(OrderClass n in orderQueue) 
     { 
      week = n.DesiredWeek; 

      if(week != n.NextWeek)//This is what i want to do 
      { 
       last = true; 
      } 
      if(last) 
      { 
       Console.WriteLine("Shipping Report for Week {0}", week); 
       Console.WriteLine(" "); 
       Console.WriteLine("Number of Orders: {0}"); 
       Console.WriteLine(" "); 
       Console.WriteLine("Products shipped: "); 
       Console.WriteLine("Cabin: "); 
       Console.WriteLine("LarghFort: "); 
       Console.WriteLine("Ranch: "); 
       Console.WriteLine("Shed: "); 
       Console.WriteLine("SmallHouse: "); 
       Console.WriteLine("Tower: "); 
       Console.WriteLine(" "); 
       last = false; 
      } 
     } 
    } 
+0

尝试'var next = orderQueue.Pop();' –

回答

1

听起来像在for循环中,你想看看队列中的下一个值而不删除它。如果这是正确的,你想用什么

var next = orderQueue.Peek(); 
if(week != next.DesiredWeek){ 
    // do stuff 
} 

编辑:我原来的例子是不完整的为你的使用情况。您需要修改迭代的方式,因为foreach迭代实际上并不会弹出元素。请参阅下面的更完整示例。

var queue = new Queue<int>(); 
queue.Enqueue(1); 
queue.Enqueue(2); 
while(queue.Count > 0) 
{ 
    var val = queue.Dequeue(); 
    Console.WriteLine("Current: {0}", val); 

    if(queue.Count > 0) 
    { 
     var next = queue.Peek(); 
     Console.WriteLine("Next: {0}", next); 
    } 
} 
0

我不认为Queue<T>是您正在操作的正确结构。由于您没有从Queue中获取任何元素,因此看起来更像是List<T>的情况。

这里说的有两种方法可以用Queue来做你正在寻找的东西。

  1. 的“破坏性”的方式是一个Queue应该被使用的方式,你Dequeue()的项目,当您去。为了实现你所寻找的,在你之后Dequeue()Peek()提前。请注意,如果Queue中没有任何内容,则两个函数都会引发异常。有多种方法可以为这只猫蒙皮。您可以在while()循环中每次迭代后得到Count,或者像下面的for循环一样显示一次。我选择了后面的这个特定情况,因为你也在前面偷看,通常我会使用while循环。
  2. 如果您遇到Queue,但这只是一个中间函数,您打电话时必须保持队列不变,并且不得包含Dequeue()项,我添加了一个只使用枚举数的非破坏性版本。请注意在签名中使用IEnumerable。这将使它与其他实现此接口的集合一起工作,并且不仅限于Queue,因为您没有使用Queue功能。

这里是代码示例,它在控制台上为每次迭代打印出一些内容,但是您可以看到将代码放在'最后'迭代情况下的位置。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Queue<OrderClass> orderQueue = new Queue<OrderClass>(); 
     for (int i = 0; i < 10; i++) 
     { 
      orderQueue.Enqueue(new OrderClass() { DesiredWeek = (i/3) }); 
     } 

     outResultNonDestructive(orderQueue); 
     outResultDestructive(orderQueue); 

    } 

    public class OrderClass 
    { 
     public int DesiredWeek { get; set; } 
    } 

    private static void outResultDestructive(Queue<OrderClass> orderQueue) 
    { 
     bool last = false; 

     int lengthOfQInTheBeginning = orderQueue.Count; 
     for (int i = 0; i < lengthOfQInTheBeginning; i++) 
     { 
      var current = orderQueue.Dequeue(); 
      if(i >= lengthOfQInTheBeginning - 1) 
      { 
       last = true; 
      } 
      else 
      { 
       var next = orderQueue.Peek(); 
       if(current.DesiredWeek != next.DesiredWeek) 
       { 
        last = true; 
       } 
      } 
      if (last) 
      { 
       //Do work... 
       Console.WriteLine(current.DesiredWeek.ToString() + " - Last? " + last.ToString()); 
       last = false; 
      } 
      else 
      { 
       Console.WriteLine(current.DesiredWeek.ToString() + " - Last? " + last.ToString()); 
      } 
     } 
    } 

    private static void outResultNonDestructive(IEnumerable<OrderClass> orderQueue) 
    { 
     bool last = false; 

     IEnumerator<OrderClass> currentEnumerator = orderQueue.GetEnumerator(); 
     IEnumerator<OrderClass> nextEnumerator = orderQueue.GetEnumerator(); 

     if(!nextEnumerator.MoveNext()) 
     { 
      //No elements 
     } 

     while(currentEnumerator.MoveNext()) 
     { 
      OrderClass next = null; 
      if(nextEnumerator.MoveNext()) 
      { 
       next = nextEnumerator.Current; 
      } 
      var current = currentEnumerator.Current; 
      if(next == null || current.DesiredWeek != next.DesiredWeek) 
      { 
       last = true; 
      } 
      if (last) 
      { 
       //Do work... 
       Console.WriteLine(current.DesiredWeek.ToString() + " - Last? " + last.ToString()); 
       last = false; 
      } 
      else 
      { 
       Console.WriteLine(current.DesiredWeek.ToString() + " - Last? " + last.ToString()); 
      } 
     } 
    } 

请注意,这两个函数都不是线程安全的!