Как я могу быстро удалить дубликаты из списка? - PullRequest
4 голосов
/ 15 июля 2011

Я хочу удалить дубликаты из большого 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;

Как мне улучшить скорость?

1 Ответ

9 голосов
/ 15 июля 2011
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;
...