有谁知道为什么这个程序的输出是这样的?(在c#中使用迭代器)

时间:2009-11-19 13:07:07

标签: c# c#-3.0 iterator

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

原因是什么?

3 个答案:

答案 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);
        }
    }
}