我目前正在学习 C#,目的是有效地使用 Razor 和 Umbraco,我有一点 PHP 背景和 JavaScript 的合理知识。
我遇到了 IEnumerator
接口(interface),但很难理解它。我在下面设置了一个代码片段来演示使用 foreach 遍历数组:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace cardEnum
{
class suitsEnumerator
{
private static string[] suits = { "Hearts", "Spades", "Diamonds", "Clubs" };
public void showAll()
{
foreach(string x in suits){
System.Console.WriteLine(x);
}
}
}
class run
{
static void Main()
{
Console.WriteLine("The suits are:");
var suits = new suitsEnumerator();
suits.showAll();
Console.ReadKey();
}
}
}
有人可以解释为什么我什至需要使用
IEnumerator
否则我可以很容易地遍历数组。我知道这是一个如此简单的问题,我只是想不出使用 IEnumerable 的理由。任何帮助都将不胜感激,谢谢!
最佳答案
这就是在您的示例中实现枚举器模式的方式。我希望这能澄清一些事情,特别是 IEnumerable
和 IEnumerator
之间的关系:
namespace cardEnum {
// simple manual enumerator
class SuitsEnumerator : IEnumerator {
private int pos = -1;
private static string[] suits = { "Hearts", "Spades", "Diamonds", "Clubs" };
public object Current {
get { return suits[pos]; }
}
public bool MoveNext() {
pos++;
return (pos < suits.Length);
}
public void Reset() {
pos = -1;
}
}
class Suits : IEnumerable {
public IEnumerator GetEnumerator() {
return new SuitsEnumerator();
}
}
class run {
static void Main() {
Console.WriteLine("The suits are:");
var suits = new Suits();
foreach (var suit in suits) {
Console.WriteLine(suit);
}
Console.ReadKey();
}
}
}
当然,这是一个帮助理解的人为例子。由于
string[]
已经实现了 IEnumerable
,因此没有理由重新发明轮子。由于 C# 支持
yields
关键字,因此最近创建 Enumerator 变得容易一些:namespace cardEnum {
// no explicit SuitsEnumerator required
class Suits : IEnumerable {
public IEnumerator GetEnumerator() {
yield return "Hearts";
yield return "Spades";
yield return "Diamonds";
yield return "Clubs";
}
}
class run {
static void Main() {
Console.WriteLine("The suits are:");
var suits = new Suits();
foreach (var suit in suits) {
Console.WriteLine(suit);
}
Console.ReadKey();
}
}
}
关于c# - 无法理解 IEnumerator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7983027/