Domanda

Ho un paio di variabili che devono essere assegnati all'interno di un ciclo for. A quanto pare, quando il ciclo si interrompe, C # ignora tutto ciò che è accaduto in là, e le variabili vengono restituiti al loro stato originale. In particolare, ho bisogno di loro di essere gli ultimi e next-to-last elementi di una lista. Ecco il codice:

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

Nota: Nevermind i nomi delle variabili cattivi, sono variabili davvero temporanee. Qualcosa di più complesso sarebbe confondere le cose.

Ora, ci sono due modi (che io sappia) per risolvere questo: uno è capire come fare le variabili vivono dopo il ciclo termina, l'altro è quello di fare qualcosa di simile in Python, dove si può fare temp = my_list[-1] a ottenere l'ultimo elemento di una lista. È uno di questi possibili in C #?

Modifica Quando provo a compilare, ottengo un "uso di non assegnata variabile locale 'temp1'" errore. Questo codice non è nemmeno eseguito, è solo seduto all'interno di un metodo che non viene mai chiamato. Se questo aiuta, sto cercando di utilizzare le variabili all'interno di un altro ciclo.

È stato utile?

Soluzione

Perché non solo fare ...

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

Altri suggerimenti

Se toReturn.Count è 0, il ciclo non finisce mai e temp1 e temp2 sono mai inizializzati.

Di cosa si tratta fare?

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

cercare di dare temp1 e temp2 un valore cioè iniziale di 0 o qualsiasi altra cosa è appropriato perché potrebbero non essere inizializzati

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];
     }
}

Il compilatore richiede che temp1 e temp2 sono sicuramente assegnato prima di provare a leggere i loro valori. Il compilatore non conosce il vostro ciclo for assegnerà le variabili. E non sa se il ciclo for mai corre a tutti. Inoltre non so se sarà mai true tuoi se-condizioni.

Il codice di cui sopra fa in modo che temp1 e temp2 sono stati assegnati a qualcosa. Se si vuole essere sicuri se temp1 e temp2 sono stati assegnati nel loop , considerate di tenere traccia di questo:

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;
     }
}

Se si desidera un valore di default:

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

Se non si preoccupano di valore predefinito e avere controlli precedenti per il conteggio in atto:

int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top