سؤال

لدي اثنين من المتغيرات التي يجب تعيينها داخل حلقة. على ما يبدو، عندما تخطئ الحلقة، يتجاهل 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

ملاحظة: NeverMind أسماء متغيرة سيئة، فهي متغيرات مؤقتة حقا. أي شيء أكثر تعقيدا سوف يخلط بين الأشياء.

الآن، هناك طريقتان (الذي أعرفه) لحل هذا: واحد هو معرفة كيفية جعل المتغيرات مباشرة بعد خروج الحلقة، والآخر هو القيام بشيء ما في بيثون، حيث يمكنك القيام به temp = my_list[-1] للحصول على العنصر الأخير من القائمة. هل أي من هذه ممكن في ج #؟

يحرر: عندما أحاول الترجمة، أحصل على خطأ "استخدام المتغير المحلي غير المعظم". لا يتم تشغيل هذا الرمز، إنه يجلس فقط داخل طريقة لا يتم استدعاؤها أبدا. إذا كان هذا يساعد، أحاول استخدام المتغيرات داخل حلقة أخرى.

هل كانت مفيدة؟

المحلول

لماذا لا تفعل فقط ...

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 القيمة الأولية IE 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 نكون بالتأكيد عينت قبل محاولة قراءة قيمها. برنامج التحويل البرمجي لا يعرف أن حلقة الخاص بك ستعيين المتغيرات. لا يعرف ما إذا كان حلقة يدير على الإطلاق. كما أنه لا يعرف ما إذا كانت شروطك إذا كانت 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