ListBox Фильтрация

У меня есть ListBox с 10 000 элементов и множеством повторяющихся элементов! Я хочу сохранить его в файл без дубликатов (один элемент вместо всех копий!) И я использую этот способ:

Function TMain.List_ExistsIn(ListBox_NAme: TListBox; EParameter: String): Integer;
Var
  i: Integer;
Begin
  EParameter := LowerCase(EParameter);
  Result := -1;
  For i:=0 To ListBox_Name.Items.Count - 1 Do
    If EParameter = Lowercase(ListBox_Name.Items[i]) Then Begin
      Result := i;
      Break;
    End;
End;

Я использую приведенный выше код для обнаружения существующего элемента и следующую процедуру для его сохранения:

Procedure TMain.MakeList(ListBox_Name: TListBox; FileName: String); //================
Var
  i: Integer;
  Temp_ListBox: TListBox;
Begin
  Temp_ListBox := TListBox.Create(Main);
  With Temp_ListBox Do Begin
    Parent := Main;
    Clear;
    For i:=0 To ListBox_Name.Count - 1 Do
      If Main.List_ExistsIn(Temp_ListBox, ListBox_Name.Items[i]) = -1 Then
        Items.Add(ListBox_Name.Items[i]);
    Items.SaveToFile(FileName);
    Free;
  End;
End;

Но на это уходит очень много времени. Есть ли лучший и быстрый способ? Спасибо.


person Armin Taghavizad    schedule 21.06.2010    source источник


Ответы (2)


Попробуй это

procedure TForm1.FormCreate(Sender: TObject);
var
  StrList: TStringList;
  I: Integer;
begin
  StrList := TStringList.Create;
  StrList.Sorted := True;
  StrList.Duplicates := dupIgnore;
  StrList.AddStrings(ListBox1.Items);  //Your List Box Items
  StrList.SaveToFile('C:\abc.txt');
  StrList.Free; //Cleanup
end;
person Bharat    schedule 21.06.2010
comment
Просто чтобы добавить к ответу Бхарата: поскольку Delphi6 TStringList имеет свойство CaseSensitive, которое контролирует, как строки оцениваются на предмет дублирования. - person Marjan Venema; 21.06.2010
comment
Не забудьте добавить StrList.Free в конце (лучше всего после попытки .. наконец). - person mjn; 21.06.2010

Остерегайтесь печально известного эффекта CompareString () ...

Вставьте 59A, 5-9A, 59-A, -59-A в отсортированный список 1. Список становится 59A, -59-A, 5-9A, 59-A и .Find () или .IndexOf () не сможет найдите 59-А.

Теперь вставьте те же значения в отсортированный список 2, но в порядке 59A, -59-A, 5-9A, 59-A. Список становится 59A, 59-A, -59-A, 5-9A. .Find () и .IndexOf () могут найти 59-A.

Дополнительные сведения см. В этом блоге.

person joe snyder    schedule 25.06.2010