Pergunta

Eu tenho um par de variáveis ??que precisam ser atribuídas dentro de um loop for. Aparentemente, quando o loop termina, C # ignora tudo o que aconteceu lá dentro, e as variáveis ??são devolvidos ao seu estado original. Especificamente, eu preciso que eles sejam os últimos e próximos ao último elementos de uma lista. Aqui está o código:

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: o Nevermind os nomes de variáveis ??ruins, eles são variáveis ??realmente temporários. Qualquer coisa mais complexa iria confundir as coisas.

Agora, há duas maneiras (que eu saiba) para resolver este: um é descobrir como fazer com que as variáveis ??viver após o loop termina, a outra é fazer algo como em Python, onde você pode fazer temp = my_list[-1] para obter o último elemento de uma lista. É qualquer um destes possível em C #?

Editar: Quando tento compilar, obtenho um "uso da variável 'temp1' não atribuído local" erro. Este código não é mesmo funcionar, é apenas sentado dentro de um método que nunca é chamado. Se isso ajuda, eu estou tentando usar as variáveis ??dentro de outro loop.

Foi útil?

Solução

Porque não basta fazer ...

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

Outras dicas

Se toReturn.Count é 0, o loop não é executado e temp1 e temp2 nunca são inicializados.

O que é isso fazer?

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

Tente dar temp1 e temp2 um valor ou seja inicial 0 ou o que for apropriado, porque eles nunca pode ser inicializado

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

O compilador requer que temp1 e temp2 são definitivamente atribuído , antes de tentar ler seus valores. O compilador não sabe o seu ciclo for irá atribuir as variáveis. Ele não sabe se o loop nunca é executado em tudo. Ele também não sabe se seus if-condições sempre será true.

O código acima garante que temp1 e temp2 foram atribuídos a algo. Se você quiser ter certeza se temp1 e temp2 foram atribuídos no circuito , considere manter o controle deste:

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 você quiser um valor padrão:

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

Se você não se preocupam com valor padrão e têm verificações anteriores para contagem no lugar:

int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top