Frage

Ich habe ein paar Variablen, die innerhalb einer for-Schleife zugeordnet werden müssen. Offensichtlich, wenn die Schleife beendet, ignoriert C #, was dort passiert ist, und die Variablen in ihren ursprünglichen Zustand zurückgeführt. Insbesondere muss ich sie die letzten und nächsten zu letzten Elemente einer Liste sein. Hier ist der 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

Hinweis: Nevermind die schlechten Variablennamen, sie sind wirklich temporäre Variablen. Alles, was komplizierter würde die Dinge verwirren.

Nun gibt es zwei Möglichkeiten (die ich kenne), diese zu lösen: Die eine ist, herauszufinden, wie die Variablen, nachdem die Schleife beendet leben zu machen, sind die andere so etwas wie in Python zu tun, wo man temp = my_list[-1] tun kann, um das letzte Element einer Liste bekommen. Ist eines dieser möglich in C #?

Bearbeiten: Wenn ich versuche, zu kompilieren, erhalte ich eine „Verwendung von nicht zugewiesenen lokalen Variablen‚temp1‘“ Fehler. Dieser Code wird nicht einmal laufen, es ist nur innerhalb einer Methode sitzen, die nie aufgerufen werden. Wenn das hilft, ich versuche, die Variablen in einer anderen Schleife zu verwenden.

War es hilfreich?

Lösung

Warum nicht einfach tun ...

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

Andere Tipps

Wenn toReturn.Count 0 ist, die Schleife nie läuft und TEMP1 und TEMP2 nie initialisiert.

Was ist das?

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

versuchen TEMP1 zu geben und TEMP2 einen Anfangswert d.h 0 oder was auch immer ist angemessen, weil sie vielleicht nie initialisiert werden

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

Der Compiler erfordert, dass temp1 und temp2 sind eindeutig zugewiesen bevor Sie versuchen, ihre Werte zu lesen. Der Compiler weiß nicht, Ihre for-Schleife die Variablen zuweist. Er weiß nicht, ob die for-Schleife jemals überhaupt läuft. Es ist auch nicht wissen, ob Ihre if-Bedingungen jemals true werden.

Der obige Code stellt sicher, dass temp1 und temp2 etwas zugewiesen wurden. Wenn Sie sicher sein wollen, ob temp1 und temp2 zugewiesen wurden, in der Schleife , sollten Sie den Überblick über diese halten:

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

Wenn Sie einen Standardwert mögen:

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

Wenn Sie kümmern sich nicht um Standardwert und haben den vorherigen Kontrollen für Zählung im Ort:

int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top