using System;
using System.Collections;
namespace Iterator_test
{
class Day
{
int days_idx = -1;
private String[] days = { "mon", "tue", "wed","thu","fri","sat","sun" };
public IEnumerable getdays()
{
days_idx++;
yield return days[days_idx];
}
}
class Program
{
static void Main(string[] args)
{
Day d = new Day();
foreach (string day in d.getdays())
{
Console.WriteLine(day);
}
}
}
}
实际上输出应该是,
mon
tue
wed
thu
fri
sat
sun
但它的打印只是“mon”,
mon
原因是什么?
答案 0 :(得分:12)
这种情况正在发生,因为getdays
方法中没有循环。您只需yield
一次,返回第一项 - “星期一” - 就是这样!
这是一个简单的解决方法。 (如果可能,请将IEnumerable
返回类型更改为IEnumerable<string>
。)
public IEnumerable getdays()
{
foreach (string day in days)
{
yield return day;
}
}
答案 1 :(得分:7)
您需要围绕yield return
:
public IEnumerable getdays()
{
while (days_idx < 6)
{
days_idx++;
yield return days[days_idx];
}
}
答案 2 :(得分:1)
Luke和Gonzalo是对的。
作为一种替代方法,因为你的getdays似乎是readonly,并没有特别做其他事情(来自你的例子)
class Day
{
public IEnumerable days
{
get
{
return new string[] { "mon", "tue", "wed", "thu", "fri", "sat", "sun" };
}
}
}
class Program
{
static void Main(string[] args)
{
Day d = new Day();
foreach (string day in d.days)
{
Console.WriteLine(day);
}
}
}