Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Break / Exit - Grundsatzfrage (https://www.delphipraxis.net/126159-break-exit-grundsatzfrage.html)

burn 19. Dez 2008 10:23


Break / Exit - Grundsatzfrage
 
Hallo,

habe mal eine eine grundsätzliche Frage.

Oft genug habe ich jetzt schon in der DP gelesen, daß
die Benutzung von Break und Exit schlechter Programmier-Stil ist.

Aber wie löse ich dann z.B. folgendes Problem:

Ich habe eine Liste bzw. Array mit Strings und möchte prüfen
ob ein String schon in der Liste vorhanden ist.

Ich mach das immer so:

Delphi-Quellcode:
function InListeVorhanden(SuchString: string): Boolean;
begin
  Result := False;
  for i := 0 to List.Count-1 do
  begin
    if SuchString = List[i] then
    begin
     Result := True;
     Exit;
    end;
  end;
end;
Setze ich ja hier das Exit nicht, rattert die Funktion ja durch die ganze Liste was
ja durchaus langsamer kein kann, wenn der Suchstring beim Index 5 gefunden
wird und z.B. 10000 Einträge vorhanden sind.

Wie sollte man es sonst machen, wenn man "guten" Programmier-Stil verwenden will.

MfG Burn...

taaktaak 19. Dez 2008 10:26

Re: Break / Exit - Grundsatzfrage
 
Moin, Moin.
Nun, wenn die Liste unsortiert ist, mache ich es auch so - und habe kein schlechtes Gewissen! In einer sortierten Liste wäre das natürlich eine schlechte Lösung. Da kommt man ja durch binäre Suche viel eleganter zum Ziel.

mirage228 19. Dez 2008 10:27

Re: Break / Exit - Grundsatzfrage
 
Du kannst das aber auch mit einer while...do schleifen lösen - gänzlich ohne Break und Exit :)

Edit: Delphi-Referenz durchsuchenTStringList.IndexOf macht auch genau das was du willst, aber es ist wenn ich mich recht erinnere so ziemlich genauso umgesetzt wie du es jetzt hattest... ;)

DeddyH 19. Dez 2008 10:28

Re: Break / Exit - Grundsatzfrage
 
Erstmal: exit verlässt die komplette Methode, break nur die aktuelle Schleife. Und beide kann man durch eine zusätzliche Schleifenbedingung umgehen, wobei das bei einer for-Schleife nicht gehen kann, hier muss man dann auf while ausweichen.
Delphi-Quellcode:
function InListeVorhanden(SuchString: string): Boolean;
var i: integer;
begin
  Result := False;
  for i := 0 to List.Count-1 do
  begin
    if SuchString = List[i] then
    begin
     Result := True;
     break;
    end;
  end;
end;

function InListeVorhanden(SuchString: string): Boolean;
var i: integer;
begin
  Result := False;
  i := 0;
  while (i < List.Count) and not Result do
  begin
    if SuchString = List[i] then
      Result := True;
    inc(i);
  end;
end;
@Ralph: darum geht es ja nicht ;)

taaktaak 19. Dez 2008 10:30

Re: Break / Exit - Grundsatzfrage
 
Sind for-Schleifen nicht schneller als while-Schleifen?

quendolineDD 19. Dez 2008 10:30

Re: Break / Exit - Grundsatzfrage
 
Nehm eine while-Schleife und setz das, worauf du prüfst als Bedingung
Delphi-Quellcode:
begin
result := False;
i := 0;
while (not Result) and (i < (List.Count -1)) do
begin
 inc(i);
 Result := (Suchstring = List [i]);
end;
end;

Sherlock 19. Dez 2008 10:31

Re: Break / Exit - Grundsatzfrage
 
Delphi-Quellcode:
function InListeVorhanden(SuchString: string): Boolean;
var i: integer;
begin
  Result := False;
  i:= 0;
  repeat
    if SuchString = List[i] then
      Result := True;
    inc(i);
  until Result or (i = (List.Count-1));
end;
Ganz ohne Exit ;)

Oh...Roter Kasten ist wohl beim Weihnachtsmann aufm Schlitten.

Sherlock

DeddyH 19. Dez 2008 10:33

Re: Break / Exit - Grundsatzfrage
 
Sherlock, bei einer leeren Liste bekommst Du mit einer Fußschleife aber Kummer.

mirage228 19. Dez 2008 10:33

Re: Break / Exit - Grundsatzfrage
 
Zitat:

Zitat von taaktaak
Sind for-Schleifen nicht schneller als while-Schleifen?

Bei einer for-Schleife wird meines Wissens nach der Wert für den Zähler nur einmal abgerufen, bei "while" bei jedem Durchlauf - in wie fern die Compiler-Optimierung die while-Schleife rückwärts laufen lässt, wie sie es in bestimmten Fällen bei der for-Schleife tut, weiß ich aber nicht...

Im Zweifelsfall die beiden Methoden mal über GetTickCount() vergleichen =)

ATSV 19. Dez 2008 10:33

Re: Break / Exit - Grundsatzfrage
 
wenn ihr so weitermacht haben wir wieder das selbe wie mit der negativen zahl :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.
Seite 1 von 3  1 23      

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