Delphi 如何快速从列表框中删除重复项?

Delphi 如何快速从列表框中删除重复项?,delphi,listbox,duplicates,Delphi,Listbox,Duplicates,我希望从一个大的TListBox中删除重复的项目。为此,我使用了一种经典的简单方法。它可以工作,但需要19分钟。我读了很多书,显然我应该使用TFileStream(?)。但我不知道怎么做 我的经典方法是: procedure NoDup(AListBox : TListBox); var i : integer; begin with AListBox do for i := Items.Count - 1 downto 0 do begin if Items.Index

我希望从一个大的TListBox中删除重复的项目。为此,我使用了一种经典的简单方法。它可以工作,但需要19分钟。我读了很多书,显然我应该使用TFileStream(?)。但我不知道怎么做

我的经典方法是:

procedure NoDup(AListBox : TListBox);
var
  i : integer;
begin
  with AListBox do
  for i := Items.Count - 1 downto 0 do
  begin
    if Items.IndexOf(Items[i]) < i then
    Items.Delete(i);
    Application.ProcessMessages;
  end;
end;
过程节点(AListBox:TListBox);
变量
i:整数;
开始
用AListBox做什么
对于i:=项。计数-1到0
开始
如果Items.IndexOf(Items[i])

如何提高速度?

添加BeginUpdate/EndUpdate对可以加快速度,但您不应该自己寻找重复项,请参阅我的答案最好的方法可能是首先避免将重复项放入列表控件。如果真的有太多的内容需要19分钟才能处理,那么你可能有太多的内容无法在没有过滤的情况下呈现给用户。非常感谢你的回复。是的,我希望复制品在之前得到控制,但“这是不可能的”。最后,我选择了下面丹尼尔的解决方案。工作起来很有魅力!来自法国的最佳人选:)Beny,你在哪里读到过TFileStream会有帮助?你的代码所花的时间部分取决于重复的数量,因为
应用程序.ProcessMessages
调用。实际上,你是说你想看到每一件物品都被移除。每次迭代都会调用,但是如果没有删除项,大多数迭代都会很快返回,但这也是不必要的时间。正如Daniel所说,将其与Begin/EndUpdate一起删除应该会产生显著的不同。一句话:谢谢!太完美了!我之前的活动时间是19分钟。您的功能时间约为1分钟。我尝试使用StringList,但没有成功。代码很简单,但非常棒:)Beny,请注意,这个方法会改变剩余项目的顺序,假设它们不是一开始就排序的。
procedure NoDup(AListBox: TListBox);
var
  lStringList: TStringList;
begin
  lStringList := TStringList.Create;
  try
    lStringList.Duplicates := dupIgnore;
    lStringList.Sorted := true;
    lStringList.Assign(AListBox.Items);
    AListBox.Items.Assign(lStringList);
  finally
    lStringList.free
  end;
end;