AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringliste indexOfName IndexofValue

Ein Thema von bernhard_LA · begonnen am 3. Jan 2020 · letzter Beitrag vom 8. Jan 2020
Antwort Antwort
Seite 2 von 2     12   
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 17:34
bin jetzt hier gelandet :

Delphi-Quellcode:
Type TStringlistHelper = class helper for TStringlist

           function IndexofValue( ValueStr : string) : Integer;
        
         end;

function TStringlistHelper.IndexofValue ( ValueStr : string) : Integer;
  var i : Integer;
begin
    i := 0;
    repeat
        if ( Pos(ValueStr, self[i])>0 ) then
            begin
              Result := i;
              exit
            end;

        Inc(i);

    until i > Self.Count-1;

    if i > Self.Count-1 then Result := -1;

end;
gibt es bessere / schnellere Lösungen ?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 17:56
gibt es bessere / schnellere Lösungen ?
Ja: ValueFromIndex benutzen statt pos.
Edit: Und eine for-Schleife.. Es sei denn du willst es extra umständlich machen
Edit2:
Delphi-Quellcode:
function TStringlistHelper.IndexofValue(AValueStr : string): Integer;
var i : Integer;
begin
  Result := -1;
  for i:= 0 to Count-1 do
  begin
    if ValueFromIndex[i] = AValueStr then // StrUtils.AnsiSameText ggf falls Case-Insensitiv
    begin
      Result := i;
      break;
    end;
  end;
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 3. Jan 2020 um 18:01 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 18:42
Hallo,
Pos('=Value2',StringList.DelimitedText) ?
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#14

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 19:49
Hallo,
Pos('=Value2',StringList.DelimitedText) ?
Das würde aber auch bei einem Eintrag 'Value22' anschlagen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 20:12
Hallo,
hach
Pos('=Value2;',StringList.DelimitedText+';') ?

mit ; als Delimiter

so
Heiko
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.053 Beiträge
 
Delphi 2009 Professional
 
#16

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 20:43
gibt es bessere / schnellere Lösungen ?
Schreit eigentlich nach
TDictionary verwenden?
und Ausgabe mit TStringBuilder.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 21:11
z.B. ja.

gibt es bessere / schnellere Lösungen ?
Ja, fast alle die nicht TStringlist verwenden
Alle Lösungen mit TStringlist sind nur Murks. Allenfalls für die reine Ausgabe könnte man eine verwenden.
Meine 2ct
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#18

AW: Stringliste indexOfName IndexofValue

  Alt 8. Jan 2020, 18:11
gibt es bessere / schnellere Lösungen ?
Ja: ValueFromIndex benutzen statt pos.
Der Witz ist, dass dein Code zwar "richtig" funktioniert, im Gegensatz zur ursprünglichen Schleife, da dort das POS irgendwas findet, auch X oder geb in xXx=Ergebnis.
Und der Code ist viel einfacher zu lesen, ist genauso schnell wie das normale IndexOfName,
aber es muß zwangsläufiger langsamer werden, als die einfache Pos-Variante.

Also besser ja, aber schneller ne.

Original wurde im String (ganze Zeile) nur gesucht/verglichen,
während ValueFromIndex erstmal langsam einen neuen String erzeugt (Teil aus Zeile kopiert) und dort dann schneller den ganzen String richtig/vollsändig vergleicht.


Hallo,
Pos('=Value2',StringList.DelimitedText) ?
Das würde aber auch bei einem Eintrag 'Value22' anschlagen.
EndsStr statt Pos wäre hier fast richtiger, aber das würde auch Ergebnis in xXx=abc=Ergebnis finden, obwohl der Wert eigentlich abc=Ergebnis wäre.
Gut, wenn man ausschließt, dass dort ein = drin vorkommt, dann reicht EndsStr aus.
Man müsste also auch noch prüfen, sodass vor dem Gefundenen kein weiteres = vorkommt.

Ansonsten ist die "einfache" Lösung mit ValueFromIndex.


Tipp: eine Zweiphasensuche
Erst schnell mit EndsStr suchen und dann jeden gefundenen Eintrag nochmal "genauer" mit ValueFromIndex nachprüfen,
falls es unbedingt schnell sein muß, auch in einer StringListe.


Schneller geht es sonst nur mit einer Liste, wo Name und Value bereits getrennt in zwei Variablen gespeichert wurden,
am Besten noch, wenn die Liste gehasht und womöglich sogar sortiert wurde.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Jan 2020 um 18:53 Uhr)
  Mit Zitat antworten Zitat
Koloss

Registriert seit: 21. Jul 2010
74 Beiträge
 
Delphi 2 Desktop
 
#19

AW: Stringliste indexOfName IndexofValue

  Alt 8. Jan 2020, 20:33
Diese Funktion reicht doch, das er sehr performant sein muss habe ich hier nicht heraus gelesen
Code:
function IsValueInStringList(strList: TStrings; Value: String): Boolean;
var
  i: integer;
begin
  Result := False;
  for i := 0 to strList.Count do
    if strList.ValueFromIndex[i] = Value then
    begin
      Result := true;
      break;
    end;
end;
Wenn man die TStrings als TStringList anlegt kann man auch davor strList.Sort verwenden.
Die TStrings sollten mit TStringList erstellt werden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.
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