我不能在我的代码中两次使用 foreach 循环,为什么?

I can't use a foreach loop twice in my code, why?

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

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

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

下面的 RunTest class 是我测试 Queue class.

实现的地方
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 class:

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];}
}
}

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

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

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