快速搜索Tmemo线

Wiz*_*ard 2 delphi performance tmemo

我在表单上有一个TMemo,允许用户输入项目列表.人们可以在这里输入很多物品.单击"保存"时,将检查TMemo的内容,然后将其添加到数据库中.

我在TStringList中有第二个列表,我循环并检查它是否包含在TMemo中的任何项目.

在坚果壳中它看起来像这样

....
//slItems = TStringList
//mItems = TMemo
for i := slItems.Count -1 downto 0 do
begin
  if mItems.Lines.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----
Run Code Online (Sandbox Code Playgroud)

所以stringlist循环,检查它是否存在于备忘录中,如果不是从列表中删除.

然而,有200多个项目开始减速很多,而1000则变得非常糟糕.

什么是搜索TMemo的最快方式?

Cos*_*und 7

阅读TMemo本地的所有内容TStringList并从中开始工作.每次访问时,TMemo.Lines您都依赖Windows消息来与Windows提供的多行文本框进行通信.除了有效率之外!

....
//slItems = TStringList
//mItems = TMemo
//L = TStringList
L.Text := mItems.Text; // edited per David's suggestion.
L.Sorted := True; // per Uwe Raabe's suggestion.
for i := slItems.Count -1 downto 0 do
begin
  if L.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----
Run Code Online (Sandbox Code Playgroud)

  • `StringList.Text:= Memo.Text`是这样做的快捷方式. (4认同)
  • 由于L中项目的顺序无关紧要,在循环之前添加"L.Sort",你应该更快. (3认同)