Question

Bien, nous allons commencer avec ce très simple clic sur un bouton de la méthode

    private void button1_Click(object sender, EventArgs e)
    {
        int counter = 1;
        List<int> items = new int[] { 1, 2, 3 }.ToList();
        List<int>.Enumerator enm = items.GetEnumerator();

        // 1
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        // 2
        if (!enm.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        //3
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        if (enm.MoveNext()) 
            throw new Exception("Unexpected continuation of list");
    }

Cette méthode ne rien faire parce que chaque affirmation gracieusement passer.Les choses sont très bien jusqu'à ce que je crois que je dois présenter une méthode permettant de supprimer la redondance

    static void AssertNext(ref int counter, List<int>.Enumerator e)
    {
        if (!e.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (e.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, e.Current));
        counter++;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var counter = 1;
        var items = new int[] { 1, 2, 3 }.ToList();
        var enm = items.GetEnumerator();
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        if (enm.MoveNext()) throw new Exception("Unexpected continuation of list");
    }

Même si, cette factorisation est simple (pour moi, au moins).Il ne pause le programme !Sur le deuxième appel à AssertNext, il semble que l'agent recenseur était déjà réinitialiser le point de départ et la cause de l'affirmation à l'échec.

Je ne comprends pas ce qu'il se passe.Je me sens vraiment comme un débutant avec ce puzzle.

Ce qui me manque ici ?

Était-ce utile?

La solution

J'imagine que cela a quelque chose à voir avec la liste.Énumérateur étant une structure.Vous le passez à une méthode, le manipulant, puis revenant.La manipulation n'aura probablement pas eu lieu pour votre instance originale.

Autres conseils

List<T>.Enumerator est un type valeur, ce qui signifie qu'il est copié dans le champ d'application de votre méthode, modifié, puis détruit à la sortie de la méthode.Essayez le passage par référence aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top