【问题标题】:How to refactor this copy lines without empty ones from a RichTextBox to an ArrayList如何将没有空行的复制行从 RichTextBox 重构为 ArrayList
【发布时间】:2021-08-03 05:17:00
【问题描述】:

我希望用户通过程序界面的复制和粘贴来添加代理地址,当按下按钮时,我想将它们复制到arraylist并继续arraylist,但是当行数很高时,它需要相当长的时间。当我添加 10,000 个代理并尝试按钮时,等待一段时间后出现错误。如何快速将richtextbox中的项目添加到arraylist列表中?

我的代码:

ArrayList plist = new ArrayList();
    
if (richTextBox1.Lines.Length > 0 && checkBox1.Checked == true)
                {
                    for (int i = 0; i < richTextBox1.Lines.Length; i++)
                    {
                        if (richTextBox1.Lines[i].ToString() != "")
                        {
                            plist.Add(richTextBox1.Lines[i].ToString());
                        }
                    }
                }

【问题讨论】:

  • 可能不是您的主要问题,但请注意 ArrayList 已弃用,应替换为 List&lt;T&gt;
  • When I added 10,000 proxies and tried the button, it gave an error after waiting for a while 那是什么错误?您在这里询问了一些事情,如果您无法弄清楚导致错误的原因,那么将项目添加到集合中的速度并不重要。
  • 旁注,您可以一次添加所有项目,而不是单独添加。我这样说是因为ArrayListList&lt;T&gt; 在调用Add 时(在某些情况下)的大小会加倍。与其每次都使用Add 那样增加大小,不如使用AddRange 并执行一次。一个简单的基准测试也有助于确认性能。
  • 合适吗? plist.AddRange(richTextBox1.Lines.Where(line =&gt; line != "").ToArray());line.Trim() != ""
  • @OlivierRogier 它对我有用。谢谢

标签: c# loops arraylist refactoring richtextbox


【解决方案1】:

您可以在条件检查后将其写在一行中:

if ( checkBox1.Checked && richTextBox1.Lines.Length > 0 )
  plist.AddRange(richTextBox1.Lines.Where(line => line != "").ToArray()); //or line.Trim() != ""

我认为除了不必要的 ToString 之外,您不会得到任何速度优化,但代码现在更短、更干净、更健壮且更易于维护。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2019-11-20
    • 2014-05-15
    • 2019-03-15
    相关资源
    最近更新 更多