2010-06-21 5 views
3

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

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; 

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

ответ

7

Попробуйте один

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; 
+2

Просто добавьте ответ Бхарат: поскольку Delphi6 TStringList имеет свойство CaseSensitive, которое контролирует, как строки оцениваются для «дублирования». –

+8

Не забудьте добавить StrList.Free в конце (лучше всего после попытки .. наконец). – mjn

1

Следите за эффектом печально CompareString() ...

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

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

Для получения более подробной информации см. this blog.