Question

J'ai un couple de variables qui doivent être assignés à l'intérieur d'une boucle for.Apparemment, lorsque la boucle s'arrête, C# ignore ce qui s'est passé là-bas, et les variables sont retournés à leur état d'origine.Plus précisément, j'ai besoin d'eux pour être le dernier et avant-dernier élément d'une Liste.Voici le code:

int temp1, temp2;
for (int i = 0; i < toReturn.Count; i++) {
     if (i == toReturn.Count - 2) { // Next-to-last element
         temp1 = toReturn[i];
     } else if (i == toReturn.Count - 1) { // Last element
         temp2 = toReturn[i];
     }
}
// At this point, temp1 and temp2 are treated as uninitialized

Note:Passons sur les mauvais noms de variables, ils sont vraiment variables temporaires.Quelque chose de plus complexe serait confondre les choses.

Maintenant, il y a deux façons (que je connais) pour résoudre ce problème:l'une est de savoir comment rendre les variables vivre après la boucle, l'autre est de faire quelque chose comme en Python, où vous pouvez faire temp = my_list[-1] pour obtenir le dernier élément d'une liste.Est l'une de ces possibles en C#?

Edit: Lorsque j'essaie de compiler, j'obtiens une "utilisation d'une variable locale non assignée 'temp1'" erreur.Ce code n'est même pas courir, c'est juste assis à l'intérieur d'une méthode qui n'est jamais appelée.Si cela aide, je suis en train d'utiliser les variables à l'intérieur d'une autre boucle.

Était-ce utile?

La solution

Pourquoi ne pas le faire ...

int temp1 = 0;
int temp2 = 0;
    if (toReturn.Count > 1)
        temp1 = toReturn[toReturn.Count - 2];
    if (toReturn.Count > 0)
        temp2 = toReturn[toReturn.Count - 1];

Autres conseils

Si toReturn.Nombre est 0, la boucle ne s'exécute et temp1 et temp2 sont jamais initialisé.

Qu'est-ce faire?

if (toReturn.Count > 1) {
    temp1 = toReturn[toReturn.Count - 2]
    temp2 = toReturn[toReturn.Count - 1]
}

essayer de donner temp1 et temp2 une valeur initiale i.e. 0 ou tout ce qui est approprié, car ils pourraient ne jamais être initialisées

int temp1 = 0; // Or some other value. Perhaps -1 is appropriate.
int temp2 = 0; 

for (int i = 0; i < toReturn.Count; i++) {
     if (i == toReturn.Count - 2) { // Next-to-last element
         temp1 = toReturn[i];
     } else if (i == toReturn.Count - 1) { // Last element
         temp2 = toReturn[i];
     }
}

Le compilateur exige que temp1 et temp2 sont certainement affecté avant d'essayer de lire leurs valeurs. Le compilateur ne connaît pas votre boucle for attribuera les variables. Il ne sait pas si la boucle exécute jamais du tout. Il ne sait pas si vos conditions if sera jamais true.

Le code ci-dessus veille à ce que temp1 et temp2 ont été assignés à quelque chose. Si vous voulez être sûr que temp1 et temp2 ont été assignés dans la boucle , pensez à garder une trace de ceci:

int temp1 = 0;
int temp2 = 0;
bool temp1Assigned = false;
bool temp2Assigned = false;

for (int i = 0; i < toReturn.Count; i++) {
     if (i == toReturn.Count - 2) { // Next-to-last element
         temp1 = toReturn[i];
         temp1Assigned = true;
     } else if (i == toReturn.Count - 1) { // Last element
         temp2 = toReturn[i];
         temp2Assigned = true;
     }
}

Si vous voulez une valeur par défaut:

int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count  > 0 ? toReturn[count - 1] : 0;

Si vous ne se soucient pas de valeur par défaut et avoir des contrôles précédents pour le comptage en place:

int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top