不确定我在这里做错了什么。我是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”循环。
答案 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;
}
}
}