不明白为什么这个循环不迭代

时间:2015-09-19 06:46:18

标签: c#

不确定我在这里做错了什么。我是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行(对于......)直接跳到最后一个右括号。嵌套的“If”语句永远不会执行。另外,我认为break语句是错误的,因为我实际上试图结束“For”循环。

5 个答案:

答案 0 :(得分:4)

您还没有正确地编写for循环。您应该用以下内容替换它:

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

您从值Screens.Count - 1开始,每步中i减1,直到i等于零。然后你停下来。

一般来说,正确的语法如下:

for (initializer; condition; iterator)
    body
  • 初始化部分设置初始条件。在进入循环之前,本节中的语句只运行一次。该部分只能包含以下两个选项之一。
  • 条件部分包含一个布尔表达式,该表达式经过评估以确定循环是应该退出还是应该再次运行。
  • 迭代器部分定义了循环体的每次迭代后发生的事情。迭代器部分包含以下语句表达式中的零个或多个,以逗号分隔
  • 循环体由一个语句,一个空语句或一个语句块组成,您可以通过在括号中包含零个或多个语句来创建它们。

有关此问题的详情,请查看here

  

您案件中的问题是什么?

第二颗子弹。条件i==0在开头是假的。因此,循环根本不会被执行。

答案 1 :(得分:0)

i == 0应为i >= 0

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

答案 2 :(得分:0)

i == 0应替换为i >= 0

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

答案 3 :(得分:0)

其他答案已经回答了你的问题,就无效for - 循环问题而言,但我想告诉你另一种解决这个问题的方法,那就是不容易出错。

由于Screens具有Count属性,我猜这是List<T>或其他IEnumerable<T>集合。在这种情况下,您不需要for - 循环。您可以在此处使用foreach

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

如果您使用foreach,那么您的其余代码将变得更容易阅读,因为您不必使用索引器。

为了向后遍历集合,您可以使用Reverse()的{​​{1}}方法,但由于它不会返回新列表,因此您必须在循环之前执行此操作。但要小心,列表现在会被反转,所以如果你在其他地方使用它,你可能想要再次反转它。

List<T>

或者将其转换为Screens.Reverse(); foreach (var screen in Screens) { // ... } 并使用返回后向枚举器的扩展方法IEnumerable<T>。如果你想在其他地方使用原始订单的列表,这将是一个更好的解决方案。

Reverse()

因为你只对var screensReversed = ((IEnumerable<Screen>)Screens).Reverse(); foreach (var screen in screensReversed) { // ... } properety为真的第一项感兴趣(你在找到它后打破循环),你可能想要完全使用linq而不需要任何手动循环:

GrabFocus

答案 4 :(得分:-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;
            }
         }
      }