8
votes

IEnumerable en C #

J'essaie d'obtenir le code suivant de compiler mais je reçois des erreurs dans VS2008. Tout le monde peut me dire où je vais mal? XXX


1 commentaires

Note, c'est une bonne idée de poster les messages d'erreur que vous obtenez également.


4 Réponses :


25
votes

Eh bien, la première erreur de compilateur que je reçois est qu'elle se plaint que:

Utilisation du type générique 'System.collections.Generic.Inumerator' nécessite des arguments de type "1"

Ceci est à la ligne 16, celui-ci: xxx

fixant qui en ajoutant une directive à l'aide de la directive System.Collections Espace de noms (Astuce: Placez le curseur juste après Ienumerator, sur le r à la fin du mot et appuyez sur Ctrl +. (Ctrl + la clé de point), il devrait vous suggérer que vous ajoutez un "Utilisation du système .Collections; «Directive, faites cela).

alors il compile et fonctionne. Est-ce que cela correspond à ce que vous attendez?

En outre, notez que vous devez toujours publier les messages d'erreur réels que vous obtenez, de cette façon, nous n'aborde pas le mauvais arbre s'il y a autre chose mal avec votre code que nous ne voyons pas au premier coup d'œil.

En outre, vous pouvez simplifier cette implémentation très courante de iEnumerable en appelant l'une des méthodes de l'autre, donc je Simplifierait la mise en œuvre des secondes méthodes telles que celle-ci: xxx

de cette façon, vous ne mettez en place que le code d'énumérateur réel une fois.

et enfin voir Earwicker 's Répondre aussi aussi, cela montre une meilleure façon d'écrire ce code entier.


2 commentaires

+1. La dernière partie de la réutilisation d'une mise en œuvre de l'énumérateur de l'autre est la cerise sur le gâteau.


Pourquoi y a-t-il 2 implémentations de l'énumérateur en premier lieu?



9
votes

Je ne sais pas pourquoi vous obtenez des erreurs, mais cela ne serait-il pas plus simple?

public static class NumbersSequence
{
    public static IEnumerable<int> Naturals
    {
        get 
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        foreach (int i in NumbersSequence.Naturals)
            Console.WriteLine(i);
    }
}


5 commentaires

Tout le monde sait que les chiffres supérieurs à 1 000 sont anormalement élevés.


Pour moi, la distinction entre les nombres «réguliers» et «grands» est à vingt mille. Je suppose que c'est une chose "mise en œuvre".


Vingt mille est incroyablement élevé. Attendez ... Nous parlons des salaires de développeurs ici, des gars droit?


Il est également intéressant de voir le différend de l'âge de l'âge émergeant ici de savoir si les nombres naturels commencent à zéro ou à un!


Si c'est la théorie du numéro, 1 est le seul numéro. Tout le reste est le résultat de l'opérateur successeur.



4
votes

légèrement hors sujet, mais peut-être intéressant à voir est cette approche:

public static class NumbersSequence
{
    public static IEnumerable<int> Naturals
    {
        get 
        {
            int i = 0;
            while(true)
                yield return i++;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        foreach (int i in NumbersSequence.Naturals.Take(1000))
            Console.WriteLine(i);
    }
}


7 commentaires

Alors, qu'est-ce que i dans naturals.get ?


Toujours agréable de voir des boucles "infinies" en action.


Comme le remarqua Pavel, vous avez manqué l'initialisation et l'incrément de i.


Je m'aime de Linq, mais mec, j'oublierais certainement de .take () dans ce cas. Je préférerais que Naturals soit une méthode acceptant un paramètre INT.


Cela ne devrait-il pas être "Rendement retour I ++"?


Ce n'est pas correct - vous devriez déclarer i à l'intérieur du obtenir . La façon dont vous l'avez maintenant, une seconde évaluation de Numérotude des numéros.naturals.take.take (1000) retournera les numéros 1000 à 1999. Ce qui devrait être la réponse à Numéros de numéros.naturals.skip (1000 ) .Take (1000)


Au lieu de tandis que (vrai) , je ferais tandis que (i



2
votes

Lasse a la bonne réponse et je sais que c'est le code d'apprentissage, mais dans l'intérêt de poursuivre votre apprentissage, je veux mentionner deux choses:

  1. énumérable.Range ()
  2. Prenez le temps de penser à cette mise en œuvre:

    . xxx


0 commentaires