2015-09-19 102 views
1

不知道我在做什麼錯在這裏。我是C#的新手,並試圖從聯機教程中轉換VB.Net代碼。我無法得到這個For循環迭代:不明白爲什麼這個循環不會迭代

if (Screens.Count > 0) 
{ 
    for (int i = Screens.Count - 1; i == 0; --i)     
    { 
     if (Screens[i].GrabFocus==true) 
     { 
      Screens[i].Focused = true; 
      DebugScreen.FocusScreen = "Focused Screen: " + Screens[i].Name; 
      break; 
     } 
    } 
} 

有2個屏幕在列表中。第二個屏幕(屏幕[1])將GrabFocus設置爲true。在調試過程中,執行從第3行(for ...)跳轉到最後一個右大括號。嵌套的「If」語句從不執行。另外,我認爲break語句是錯誤的,因爲我實際上試圖結束「For」循環。

回答

4

您沒有正確寫入您的for循環。您應該替換爲以下:

for (int i = Screens.Count - 1; i >=0; --i) 

您從價值Screens.Count - 1開始,您可以通過1每一步i下降,直到i變爲等於零。然後你停下來。

一般而言,正確的語法如下:

for (initializer; condition; iterator) 
    body 
  • 初始化器部分設定的初始條件。在進入循環之前,本節中的語句只運行一次。該部分只能包含以下兩個選項之一。
  • 條件部分包含一個布爾表達式,用於確定循環是應該退出還是應該再次運行。
  • 迭代器部分定義了循環體的每次迭代之後發生的事情。迭代器部分包含零個或多個以逗號分隔的以下語句表達式
  • 循環的主體由一個語句,一個空語句或一個語句塊組成,您可以通過將零個或多個語句括在花括號。

欲瞭解更多關於此信息,請看看here

你的情況是什麼問題?

第二個項目符號。條件i==0在開始時是錯誤的。因此循環將不會被執行。

+0

莫非請downvoter解釋發生了什麼問題?先謝謝你 ! – Christos

+0

感謝您的詳細回覆。我不得不說,我有點尷尬。沒有更多的3am編碼給我! – pharmacyguy42

+0

@ pharmacyguy42歡迎您!我很高興我幫助:) – Christos

0

i == 0應該i >= 0

for (int i = Screens.Count - 1; i >= 0; --i) 
0

i == 0i >= 0

for (int i = Screens.Count - 1; i >=0; --i) 
-1

for loop更換是不正確的。這裏的是代碼

if (Screens.Count > 0) 
     { 
     for (int i = Screens.Count - 1; i >= 0; --i)     
     { 
      if (Screens[i].GrabFocus==true) 
      { 
       Screens[i].Focused = true; 
       DebugScreen.FocusScreen = "Focused Screen: " + Screens[i].Name; 
       break; 
      } 
     } 
     } 
0

其他的答案已經回答您的問題只要不工作for -loop而言,但我想告訴你解決這個是不容易出錯的另一種方式。

由於Screens有一個Count財產我想這是一個List<T>或其他IEnumerable<T>集合。在這種情況下,您不需要for -loop。您可以使用這裏foreach

foreach (var screen in Screens) 
{ 
    if (screen.GrabFocus==true) 
    { 
     screen.Focused = true; 
     DebugScreen.FocusScreen = "Focused Screen: " + screen.Name; 
     break; 
    } 
} 

如果使用代碼的foreach有其餘部分將變得更容易閱讀,因爲你將不必使用索引。

爲了向後遍歷集合,可以使用List<T>Reverse()方法,但是因爲它不會返回新列表,所以在循環之前必須先完成此操作。但要小心,列表現在會顛倒過來,所以如果您在其他地方使用它,您可能需要再次將其反轉。

Screens.Reverse(); 
foreach (var screen in Screens) 
{ 
    // ... 
} 

,或者你丟在一個IEnumerable<T>和使用擴展方法Reverse()返回向後枚舉。如果您想在其他地方使用其原始順序的列表,這將是更好的解決方案。

var screensReversed = ((IEnumerable<Screen>)Screens).Reverse(); 
foreach (var screen in screensReversed) 
{ 
    // ... 
} 

而且因爲你有興趣只在GrabFocus properety是真正的第一項(你打破循環找到它之後)你可能完全要使用LINQ無需任何手動循環:

var screen = Screens.FirstOrDefault(s => s.GrabFocus); 
if (screen != null) 
{ 
    screen.Focused = true; 
    DebugScreen.FocusScreen = "Focused Screen: " + screen.Name; 
} 
相關問題