Delphi-PRAXiS
Seite 5 von 7   « Erste     345 67      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String in TStringList finden verschnellern? (https://www.delphipraxis.net/191366-string-tstringlist-finden-verschnellern.html)

Uwe Raabe 9. Jan 2017 11:22

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von p80286 (Beitrag 1358450)
wenn du mit
Delphi-Quellcode:
.sorted:=True;
arbeitest, dann mußt Du noch eine Behandlung von doppelten Datensätzen mit einbauen z.B.
Delphi-Quellcode:
.Duplicates:=dupIgnore;

Das entspricht aber auch der Standardeinstellung. Lediglich für ein anderes Verhalten muss das explizit gesetzt werden.

DeddyH 9. Jan 2017 11:30

AW: String in TStringList finden verschnellern?
 
Müssen? War es nicht eher andersherum, wenn Duplikate ausgeschlossen werden sollen, muss Sorted auf true gesetzt werden?

Uwe Raabe 9. Jan 2017 11:46

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von DeddyH (Beitrag 1358452)
Müssen? War es nicht eher andersherum, wenn Duplikate ausgeschlossen werden sollen, muss Sorted auf true gesetzt werden?

Das Duplicates-Property wird sowieso nur dann ausgewertet, wenn Sorted auf true steht. Erst dann kann man einstellen, ob Duplikate einfach ignoriert werden, aufgenommen werden oder eine Exception generieren.

Das Zulassen von Duplikaten bei einer sortierten Liste ist allerdings etwas zweischneidig: man weiß nie, welches er beim IndexOf/Find zurückliefert.

p80286 9. Jan 2017 12:08

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1358451)
Zitat:

Zitat von p80286 (Beitrag 1358450)
wenn du mit
Delphi-Quellcode:
.sorted:=True;
arbeitest, dann mußt Du noch eine Behandlung von doppelten Datensätzen mit einbauen z.B.
Delphi-Quellcode:
.Duplicates:=dupIgnore;

Das entspricht aber auch der Standardeinstellung. Lediglich für ein anderes Verhalten muss das explizit gesetzt werden.

Wobei "Standard" wohl von Version zu Version verschieden ist. Unter D7 war es wohl
Delphi-Quellcode:
dupError

Gruß
K-H

a.def 9. Jan 2017 12:36

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von p80286 (Beitrag 1358450)
@a.def
wenn du mit
Delphi-Quellcode:
.sorted:=True;
arbeitest, dann mußt Du noch eine Behandlung von doppelten Datensätzen mit einbauen z.B.
Delphi-Quellcode:
.Duplicates:=dupIgnore;
Gruß
K-H

Danke für den Hinweis. Das Schöne ist ja, dass es keine doppelten Einträge geben kann. Jedenfalls theoretisch. Ich habe noch nie zwei identische Dateinamen im selben Verzeichnis auf meiner Festplatte gesehen.

Uwe Raabe 9. Jan 2017 13:13

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von p80286 (Beitrag 1358461)
Wobei "Standard" wohl von Version zu Version verschieden ist. Unter D7 war es wohl
Delphi-Quellcode:
dupError

Kann ich zumindest bei meinem Delphi 7 nicht bestätigen. Dort ist ebenso
Delphi-Quellcode:
TDuplicates = (dupIgnore, dupAccept, dupError);
und da es im Create oder anderswo nicht gesetzt wird, entspricht der Standardwert auch dort
Delphi-Quellcode:
TDuplicates(0) = dupIgnore
.

nahpets 9. Jan 2017 13:32

AW: String in TStringList finden verschnellern?
 
Unter Delphi 7 erfolgt das Einfügen von Daten mit dieser Routine:
Delphi-Quellcode:
function TStringList.Add(const S: string): Integer;
begin
  Result := AddObject(S, nil);
end;

function TStringList.AddObject(const S: string; AObject: TObject): Integer;
begin
  if not Sorted then
    Result := FCount
  else
    if Find(S, Result) then
      case Duplicates of
        dupIgnore: Exit;
        dupError: Error(@SDuplicateString, 0);
      end;
  InsertItem(Result, S, AObject);
end;
dupIgnore ist der "Normalfall", d. h.: Beim Auftreten von Dubletten werden diese nicht eingefügt. Die Stringliste hat also einen eindeutigen Inhalt.
Mit dupError kann man sich aber auch 'nen Fehler ausgeben lassen.

Egal welche Wahl man trifft: Sofern Sorted = True, gibt es keine Dubletten in der Stringliste.

Uwe Raabe 9. Jan 2017 13:38

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von nahpets (Beitrag 1358474)
Egal welche Wahl man trifft: Sofern Sorted = True, gibt es keine Dubletten in der Stringliste.

Das sehe ich anders! Bei
Delphi-Quellcode:
dupAccept
trifft keines der case-Labels zu und der Code springt direkt zum
Delphi-Quellcode:
InsertItem
. Hast du es mal probiert?

nahpets 9. Jan 2017 13:42

AW: String in TStringList finden verschnellern?
 
Upps, Du hast recht.

Da hab' ich wohl mal wieder nur halb gelesen oder nur das gesehen, was ich sehen wollte oder so :-(

a.def 9. Jan 2017 13:50

AW: String in TStringList finden verschnellern?
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
 sl: TStringList;
begin
 sl := TStringList.Create;

 try
  sl.Sorted := False;

  sl.Add('123');
  sl.Add('456');
  sl.Add('123');

  ShowMessage('Sorted False:' + sLineBreak + sl.Text);

  sl.Sorted := True;
  ShowMessage('Sorted True:' + sLineBreak + sl.Text);
 finally
  sl.Free;
 end;
Keinerlei Fehler beim Setzen von Sorted True im Nachhinein, selbst wenn Einträge Doppelt vorhanden sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.
Seite 5 von 7   « Erste     345 67      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz