Кто-нибудь знает, почему вывод этой программы такой? (С помощью итератора в c #) - PullRequest
2 голосов
/ 19 ноября 2009
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

В чем будет причина?

Ответы [ 3 ]

12 голосов
/ 19 ноября 2009

Это происходит потому, что в вашем методе getdays нет цикла. Вы просто yield один раз возвращаете первый элемент - "mon" - и все!

Вот это легко исправить. (Если возможно, измените тип возврата IEnumerable на IEnumerable<string>.)

public IEnumerable getdays()
{
    foreach (string day in days)
    {
        yield return day;
    }
}
7 голосов
/ 19 ноября 2009

Вы должны иметь петлю вокруг yield return:

public IEnumerable getdays()
{    
    while (days_idx < 6)
    {
        days_idx++;
        yield return days[days_idx];
    }    
}
1 голос
/ 19 ноября 2009

Люк и Гонсало верны.

в качестве альтернативного подхода, поскольку ваши рабочие дни кажутся только для чтения и особо ничего не делают (из вашего примера)

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...