【问题标题】:VB.Net For Loop Takes So LongVB.Net For 循环需要很长时间
【发布时间】:2021-01-08 09:33:41
【问题描述】:

我有 3 个文本框。第一个和第二个文本框包含大约 40.000 到 80.000 行数据。每行最多有 6-7 个字符。最后一个复选框有 800-1000 行数据。这些行也有 6-7 个字符。为了将所有这些数据保存在一个文本文件中,我首先在每行的开头添加一个时间标签,在一个选项卡之后写入第一个文本框行,然后是第二个 tbox,第三个 tbox,然后是一个新行。就这样继续下去。

我使用 3 个复选框来了解用户想要保存哪些文本框。点击保存按钮后,下面的这个循环开始。但是需要这么长时间。甚至用户选择只保存第一个文本框,这意味着,比如说 50.000 行,它几乎需要一分钟!

我尝试了诸如写入字符串、使用 StringBuilder、使用 do-while 循环等方法,但无法获得显着效果。我在互联网和论坛上搜索了不同的方法,但找不到方法。

有没有什么有效的方法让它工作得更快?

For i = 0 To linesCount - 1
            textStr.Append(timeCount & vbTab)
            If (cbSaveOutput.Checked And Not tbOutput.Text = "") Then textStr.Append(tbOutput.Lines(i) & vbTab)
            If (cbSaveForce.Checked And Not tbForce.Text = "") Then textStr.Append(tbForce.Lines(i) & vbTab)
            If (cbSaveCrop.Checked And Not tbCroppedData.Text = "" And i < tbCroppedData.Lines.Length) Then textStr.Append(tbCroppedData.Lines(i))
            textStr.Append(Environment.NewLine)
            timeCount = Math.Round(timeCount + (1 / tbSampleRate.Text), 6)
            ProgressBar1.Increment(1)
        Next

【问题讨论】:

    标签: string vb.net loops for-loop


    【解决方案1】:

    主要问题是您一遍又一遍地使用Lines 属性。 Lines 不是“实时”数据。获取属性值时,控件会先获取Text属性值,然后拆分成一个新数组。您对每个TextBox 中的每一行都执行此操作,第三个TextBox 执行两次。这显然很糟糕。正如您在使用Lines 属性时应始终做的那样,只获取一次并将值分配给变量,然后一遍又一遍地使用该变量。您可以对该代码进行其他改进,但这是主要问题,将大大减少时间。

    【讨论】:

    • 天哪,多亏了你...我将所有文本框拆分为数组,并将整数用于 Lines.Length,并使用 20.000-25.000 行进行了测试。原来用了2多分钟,现在用了10秒!快 12 倍。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多