提问人:deinmar_krain 提问时间:11/5/2023 更新时间:11/5/2023 访问量:46
闯入 For Loop(有一些问题)
break in For Loop (have some issues)
问:
所以我目前在 C# 中使用 EPPLUS,尝试从 excel 文件中获取一些数据。它正在工作,但是,休息;让我的头“砰砰砰”地响。我的 for 循环中有一些段,如果我放 break;或者摆脱它,阻止我的程序通过并冻结它。所以我被困在这段代码上,它只是冻结了我的应用程序。你能帮我吗?(请不要说我傻或类似的东西,我正在学习)
for (int row = 2; row <= end.Row;)
{ // Row by row...
for (int col = start.Column; col <= end.Column; col++)
{ // ... Cell by cell...
string cellValue = ws.Cells[row, col].Text;
if (String.Compare(cellValue, "Номер Машины", true) == 0)
{
for (int row_ = row + 1; row_ <= end.Row;)
{
for (int col_ = col; col_ <= end.Column;)
{
string cellValue_ = ws.Cells[row_, col_].Text;
MessageBox.Show(cellValue_);
for (int row__ = row_ + 1; row__ <= end.Row;)
{
for (int col__ = col_; col__ <= end.Column;)
{
string cellValue__ = ws.Cells[row__, col__].Text;
if (cellValue__ != string.Empty)
{
MessageBox.Show(cellValue__);
break;
}
}
break;
}
break;
}
break;
}
}
}
break;
}
我正在玩“休息”,但这只会让一切变得更糟,感谢上帝,我有一个备份
答:
1赞
Olivier Jacot-Descombes
11/5/2023
#1
这些中断会立即退出电流环路。因此,所有这些外部循环将只循环一次。您不能使用中断从最里面的循环退出所有循环。
在极少数情况下,使用语句是有意义的:goto
// (Code simplified)
for (int row_ = row + 1; row_ <= end.Row; row_++) {
for (int col_ = col; col_ <= end.Column; col_++) {
for (int row__ = row_ + 1; row__ <= end.Row; row__++) {
for (int col__ = col_; col__ <= end.Column; col__++) {
if (cellValue__ != string.Empty) {
MessageBox.Show(cellValue__);
goto exit_all;
}
}
}
}
}
exit_all:
如果要从最里面的循环返回结果,可以将此代码放入方法或局部函数中,然后使用语句退出所有循环和方法:return
// (Code simplified)
string GetResult()
{
for (int row_ = row + 1; row_ <= end.Row; row_++) {
for (int col_ = col; col_ <= end.Column; col_++) {
for (int row__ = row_ + 1; row__ <= end.Row; row__++) {
for (int col__ = col_; col__ <= end.Column; col__++) {
if (cellValue__ != string.Empty) {
return cellValue__;
}
}
}
}
}
}
我还添加了所有缺失的内容,正如@jmcilhinney和@RetiredNinja在他们的评论中指出的那样。请注意,如果不固化循环变量,则让循环永远循环(除非它们以 break 退出)。这就是导致冻结的原因。loop_variable++
评论
break
for (int row_ = row + 1; row_ <= end.Row; /* empty? */)
break