2009-11-19 4 views
2
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); 
     } 
    } 
    } 
} 

En fait, la sortie doit être,Quelqu'un sait pourquoi la sortie de ce programme est comme ça? (En utilisant iterator en C#)

mon 
tue 
wed 
thu 
fri 
sat 
sun 

mais son impression que "mon" comme,

mon 

Quelle sera la raison?

+0

S'il vous plaît assurez-vous d'accepter une réponse correcte, c'est là un système comme gains stackoverflow c'est l'utilité! –

Répondre

12

Cela se produit car il n'y a pas de boucle dans votre méthode getdays. Vous avez juste yield une fois, en retournant le premier élément - "mon" - et c'est tout!

Voici une solution facile. (Si possible, changez le type IEnumerable de retour à IEnumerable<string> aussi.)

public IEnumerable getdays() 
{ 
    foreach (string day in days) 
    { 
     yield return day; 
    } 
} 
+0

Merci beaucoup Luc .. – Babu

+0

+1 - Je ne vote généralement pas quand j'ai fourni une réponse moi-même, mais vous en obtenez un pour de bonnes suggestions de réécriture et d'amélioration. –

7

Vous devez avoir une boucle autour du yield return:

public IEnumerable getdays() 
{  
    while (days_idx < 6) 
    { 
     days_idx++; 
     yield return days[days_idx]; 
    }  
} 
+0

ya son travail..Merci. – Babu

1

Luc et Gonzalo sont corrects.

comme une autre approche que votre GetDays semble être en lecture seule et ne fait pas particulièrement bien d'autres (de votre exemple)

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); 
     } 
    } 
} 
+0

@Kamal: Vous êtes un homme Genius.Son travail.Merci. – Babu

+0

réponse courte - testé - fonctionne :) le rendement est plus sur l'état de retenue de la méthode. ceci l'explique bien http://www.alteridem.net/2007/08/22/the-yield-statement-in/c – Kamal

+0

@Kamal: Le lien explique bien le rendement .. – Babu

Questions connexes