闯入 For Loop(有一些问题)

break in For Loop (have some issues)

提问人:deinmar_krain 提问时间:11/5/2023 更新时间:11/5/2023 访问量:46

问:

所以我目前在 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;
}

我正在玩“休息”,但这只会让一切变得更糟,感谢上帝,我有一个备份

C# for 循环 中断

评论

1赞 jmcilhinney 11/5/2023
也许你可以解释一下代码实际上应该实现什么,而不是期望我们每个人都自己解决它。也许你也可以通过改变代码来解释你试图解决的问题。
0赞 Retired Ninja 11/5/2023
你提到删除和“它只是冻结了我的应用程序”。您有几个嵌套循环,它们看起来都像是通常递增索引变量的位置是空的,而索引变量永远不会在其他任何地方更改。如果您不使用退出这些循环,您期望如何结束这些循环?breakfor (int row_ = row + 1; row_ <= end.Row; /* empty? */)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++