2010-06-21 58 views
3

我有一个列表框,有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

只需添加到Bharat的答案:由于Delphi6 TStringList有一个CaseSensitive属性,控制字符串如何评估“重复性”。 – 2010-06-21 10:15:41

+8

不要忘记在最后添加一个StrList.Free(最好在尝试后..最后)。 – mjn 2010-06-21 10:47:47

1

当心臭名昭著CompareString()效果...

插入59A,5-9A,59A,-59-A到排序列表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。 。找到()和.IndexOf()可以找到59-A。

查看this blog了解更多详情。