Вопрос

У меня есть пара переменных, которые нужно присвоить внутри цикла for.Судя по всему, при выходе из цикла C# игнорирует все, что там произошло, и переменные возвращаются в исходное состояние.В частности, мне нужно, чтобы они были последним и предпоследним элементами списка.Вот код:

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

Примечание:Не обращайте внимания на плохие имена переменных, на самом деле это временные переменные.Что-то более сложное могло бы запутать ситуацию.

Есть два способа (насколько я знаю) решить эту проблему:один из них — выяснить, как сделать переменные живыми после выхода из цикла, другой — сделать что-то вроде Python, где вы можете сделать temp = my_list[-1] чтобы получить последний элемент списка.Возможно ли что-нибудь из этого на C#?

Редактировать: Когда я пытаюсь скомпилировать, я получаю сообщение об ошибке «использование неназначенной локальной переменной temp1».Этот код даже не запускается, он просто находится внутри метода, который никогда не вызывается.Если это поможет, я пытаюсь использовать переменные внутри другого цикла.

Это было полезно?

Решение

Почему бы просто не сделать...

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

Другие советы

Если toReturn.Count равен 0, цикл никогда не запускается, а temp1 и temp2 никогда не инициализируются.

Что это делает?

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

попробуйте присвоить temp1 и temp2 начальное значение, т. е. 0 или любое другое подходящее значение, потому что они могут никогда не быть инициализированы.

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

Компилятор требует, чтобы temp1 и temp2 являются определенно назначен прежде чем пытаться прочитать их значения.Компилятор не знает, что ваш цикл for назначит переменные.Он не знает, выполняется ли вообще цикл for.Он также не знает, будут ли когда-либо ваши условия if true.

Приведенный выше код гарантирует, что temp1 и temp2 были назначены на что-либо.Если вы хотите быть уверены, temp1 и temp2 были назначены в петле, рассмотрите возможность отслеживания этого:

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

Если вам нужно значение по умолчанию:

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

Если вас не волнует значение по умолчанию и у вас есть предыдущие проверки количества:

int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top