3

10,000 個のアイテムと多数の重複アイテムを含む ListBox があります。重複するアイテムのないファイルに保存します(すべてのコピーではなく1つのアイテムです!)そして、私はこの方法を使用します:

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;

しかし、先に進むには非常に長い時間がかかります。より良くて速い方法はありますか? ありがとう。

4

2 に答える 2

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;
于 2010-06-21T09:48:21.360 に答える
1

悪名高い CompareString() 効果に注意してください...

59A、5-9A、59-A、-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となります。.Find() と .IndexOf() は 59-A を見つけることができます。

詳しくはこちらのブログをご覧ください。

于 2010-06-25T04:51:57.487 に答える