Énumérateur comme argument
-
10-12-2019 - |
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 ?
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.