【问题标题】:I can't use a foreach loop twice in my code, why?我不能在我的代码中使用两次 foreach 循环,为什么?
【发布时间】:2020-11-05 19:50:55
【问题描述】:

我目前正在尝试学习 C#,我正在尝试从头开始实现 Queue。

目前我正在尝试实现foreach 功能,以便我可以打印出我的队列。 当我在代码中使用foreach 循环两次时遇到问题,第二次使用它时它不会打印任何内容。我已经设法看到我第二次使用 foreach 循环时没有使用 Queue 类中的 Current 方法(在 int 位置变量的打印语句的帮助下,它没有在第二次使用 foreach 时打印出任何内容)。

感谢任何帮助我理解为什么我不能在我的代码中使用两次 foreach 循环。如果我的代码还有什么可以改进的地方,那也将不胜感激。

下面的 RunTest 类是我测试我的 Queue 类的实现的地方。

namespace RunTest
{
    class RunTest
    {
        public static void Main(string[] args){

            Queue<string> queueOfStrings = new Queue<string>();

            queueOfStrings.Enqueue("Dog");
            queueOfStrings.Enqueue("Cat");
            queueOfStrings.Enqueue("Mouse");
            queueOfStrings.Enqueue("Bird");

            System.Console.WriteLine("Foreach: \n");
            foreach(string item in queueOfStrings){
                System.Console.WriteLine(item);
            }
            System.Console.WriteLine("\n");

            System.Console.WriteLine("Peek: "+queueOfStrings.Peek());
            System.Console.WriteLine("Dequeue : "+queueOfStrings.Dequeue());
            System.Console.WriteLine("Peek: "+queueOfStrings.Peek());

            System.Console.WriteLine("Foreach: ");
            foreach(string item2 in queueOfStrings){
                System.Console.WriteLine(item2);
            }


        }
    }
}

这是我的Queue 课程:

using System;
using System.Collections;
using System.Collections.Generic;

public class Queue<T> : IEnumerator,IEnumerable{

private LinkedList<T> list = new LinkedList<T>();
private T[] storeElements;

private int position = -1;

public Queue()
{
    Console.WriteLine("Queue initialized \n");
    
}

public void Enqueue(T data){

    list.AddFirst(data);

}



public int Count(){
    return list.Count;
}

public void Clear(){
    list.Clear();
}

public T Dequeue(){
    T data = list.Last.Value;
    list.RemoveLast();
    return data;
}

public T Peek(){
    return list.Last.Value;
}

private void ToArray(){
    storeElements = new T[Count()];
    list.CopyTo(storeElements, 0);
    Array.Reverse(storeElements);
}


//IEnumerator and IEnumerable require these methods.
public IEnumerator GetEnumerator()
{
    ToArray();
    return (IEnumerator)this;
}
//IEnumerator
public bool MoveNext()
{
    position++;
    return (position < Count());
}
//IEnumerable
public void Reset()
{
    position = 0;
}
//IEnumerable
public object Current
{
    get { System.Console.WriteLine(position); return storeElements[position];}
}
}

【问题讨论】:

  • Using the free, built-in Step Debugger 调试代码比您想象的要容易。它还将帮助您了解代码的执行方式,从而帮助您编写更好的代码。
  • 使用内置的Queue对象即可。

标签: c# foreach queue


【解决方案1】:

使用队列本身作为枚举器并不是一个好主意——它确实会限制类的使用方式。例如,想象一下,如果您想检查队列是否有重复项——您必须创建一个嵌套循环,这意味着两个同时存在的枚举数。它根本行不通,因为只有一个 position 变量。

看看built-in classes是怎么做的。它们返回一个单独的枚举器类的新实例(例如,一个数组将创建一个SZArrayEnumerator)。在您的情况下,您可能可以利用支持字段本身提供的枚举器,如下所示:

public IEnumerator GetEnumerator()
{
    ToArray();
    return storeElements.GetEnumerator();
}

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 2017-06-13
    • 2019-03-26
    • 1970-01-01
    • 2018-05-18
    • 2012-03-30
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多