我不能在我的代码中两次使用 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();
}
我目前正在尝试学习 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();
}