【问题标题】:Do Loop causes application freezingDo Loop 导致应用程序冻结
【发布时间】:2021-03-04 17:12:22
【问题描述】:

我必须生成一个彼此等距的数字序列。我有下限、上限和从一个到另一个的步骤。为此,我编写了一个 Do-Loop 子句。如果我尝试使用很少的数字作为输出(提供的代码中的 y 大小写)来执行此操作,它可以正常工作,但是当数字更多(下面代码中的 z 大小写)时,我的软件会冻结。这是我在 VS2019 中提供的代码:

    Dim y As Double = DataGridView2.Rows(0).Cells(2).Value
    Dim z As Double = DataGridView2.Rows(0).Cells(4).Value
    Do
        ListBox8.Items.Add(y)
        y += CDbl(Form1.TextBox2.Text)
    Loop Until y = DataGridView2.Rows(0).Cells(3).Value
    ListBox8.Items.Add(y)
    Do
        ListBox9.Items.Add(z)
        z += CDbl(Form1.TextBox2.Text)
    Loop Until z = DataGridView2.Rows(0).Cells(5).Value
    ListBox9.Items.Add(z)

对于我试图使其工作的情况,y-case 有 4 个数字作为输出,而 z-case 应该提供 61 个数字作为输出。我该如何解决这个问题? 谢谢大家会回答我。

最好的问候

【问题讨论】:

标签: vb.net do-loops


【解决方案1】:

您可以将其更改为:

While z <= DataGridView2.Rows(0).Cells(5).Value
    ListBox9.Items.Add(z)
    z += CDbl(Form1.TextBox2.Text)
End While

这样它就不会陷入寻找精确匹配的无限循环。

【讨论】:

    【解决方案2】:

    您应该避免在循环中操作 GUI。这是非常低效的。您应该创建一个 Integer 列表并将此列表绑定到您的 DataGridView 或 ListBox 或其他任何东西。

    尝试类似:

    List<Double> data = new List<Double>():
    data.Add(1.0); // add as many as you want
    listbox.DataSource=data
    

    在网上查找数据绑定示例。我现在在手机上。如果它不起作用,请告诉我,我将提供工作代码。

    您可能永远不会处于 z 与 gridview 单元格中的值完全相等的位置。这是因为浮点舍入误差。因此应该是:

    Loop Until Math.Abs(z - target) < epsilon
    

    target 是您的单元格内容。 epsilon 是一个很小的数字,例如 0.001。

    【讨论】:

    • 你能解释一下如何添加数据吗?我不明白如何告诉软件在达到收敛时停止填充列表。
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2017-09-16
    相关资源
    最近更新 更多