Удаление повторяющихся элементов из ListBox в Delphi - PullRequest
0 голосов
/ 21 октября 2011

Как я могу удалить дубликаты элементов из ListBox в Delphi? Я знаю это:

for i := ListBox1.Items.Count-1 downto 1 do
     for j := 0 to i-1 do
       if ListBox1.Items[i] = ListBox1.Items[j] then
         ListBox1.Items.Delete[i]; 

Но мне нужно удалять дубликаты, только если первые 10 букв совпадают, поэтому я попробовал это:

for i := ListBox1.Items.Count-1 downto 1 do
         for j := 0 to i-1 do
           if copy(ListBox1.Items[i],1,11) = copy(ListBox1.Items[j],1,11) then
             ListBox1.Items.Delete[i]; 

Но когда я пытаюсь удалить дубликаты, я получаю ошибку списка связей: (* ​​1007 *

Ответы [ 2 ]

10 голосов
/ 21 октября 2011

Вам необходимо добавить break после Delete:

if Copy(ListBox1.Items[i], 1, 10) = Copy(ListBox1.Items[j], 1, 10) then
begin
  ListBox1.Items.Delete(i); 
  break;
end;

(Действительно, если вы Delete элемент с индексом i, то как вы можете сделать сравнение if Copy(ListBox1.Items[i], 1, 10) = ... в следующий раз?)

4 голосов
/ 21 октября 2011

Если вы не возражаете против сортировки элементов в ListBox1, вы можете удалить дубликаты за один проход.

var
  s: string;
  I: Integer;
begin
  ListBox1.Sorted := True;
  s := '';
  I := 0;
  while I < ListBox1.Count do
  begin
    if s = copy(ListBox1.Items[I], 1, 10) then
    begin
      ListBox1.Items.Delete(I);
    end
    else
    begin
      s := copy(ListBox1.Items[I], 1, 10);
      Inc(I);
    end;
  end;
end;
...