![]() |
Stringliste indexOfName IndexofValue
meine Stringliste hat folgenden Inhalt
key1=Value1 keyA=Value2 keyV=Value3 keyX=Value4 Ich möchte in meine Liste nur dann ein neues Paar "key=value" einfügen, wenn der value nicht schon exitiert. StringList.IndexofName hilft mir nicht, eine Funktion IndexOfvalue würde ich benötigen Gibt es hier schon etwas ? |
AW: Stringliste indexOfName IndexofValue
Ich weiß nicht wie das bei dir aussieht aber kannst du Key und Value nicht einfach tauschen?
|
AW: Stringliste indexOfName IndexofValue
Wie wär's mit
![]() Grüße Dalai |
AW: Stringliste indexOfName IndexofValue
Values gibt nur den Wert zu einem Key. Damit kriegt man nicht raus ob IRGENDEIN Key einen bestimmten Value hat.
|
AW: Stringliste indexOfName IndexofValue
tauschen von Key und Value geht leider nicht muss mich hier an ein festes Ausgabeformat halten,
will halt eine Suche ob ein Substring vorhanden ist vor jedem Einfügen vermeiden, die Listen können sehr lang werden |
AW: Stringliste indexOfName IndexofValue
Tja, eine simple Variante ist, eine Kopie der Funktion IndexOfName zu machen und sie zu einem IndexOfValue umzuarbeiten. Ob man das dann als Ableitung von TStrings/TStringList macht oder ob das auch als Helper möglich ist, weiß ich nicht (nie benutzt).
Grüße Dalai |
AW: Stringliste indexOfName IndexofValue
Hallo,
Zitat:
Korrektur Zitat:
Aso die ganz normale Suche benutzen. |
AW: Stringliste indexOfName IndexofValue
Zitat:
|
AW: Stringliste indexOfName IndexofValue
TDictionary verwenden?
|
AW: Stringliste indexOfName IndexofValue
Zitat:
Delphi-Quellcode:
prüfen.
ValueFromIndex
|
AW: Stringliste indexOfName IndexofValue
bin jetzt hier gelandet :
Delphi-Quellcode:
gibt es bessere / schnellere Lösungen ?
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; |
AW: Stringliste indexOfName IndexofValue
Zitat:
Edit: Und eine for-Schleife.. Es sei denn du willst es extra umständlich machen :P 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; |
AW: Stringliste indexOfName IndexofValue
Hallo,
Pos('=Value2',StringList.DelimitedText) ? |
AW: Stringliste indexOfName IndexofValue
Zitat:
|
AW: Stringliste indexOfName IndexofValue
Hallo,
hach ;) Pos('=Value2;',StringList.DelimitedText+';') ? mit ; als Delimiter so ;) |
AW: Stringliste indexOfName IndexofValue
Zitat:
Zitat:
|
AW: Stringliste indexOfName IndexofValue
z.B. ja.
Zitat:
Alle Lösungen mit TStringlist sind nur Murks. Allenfalls für die reine Ausgabe könnte man eine verwenden. Meine 2ct |
AW: Stringliste indexOfName IndexofValue
Zitat:
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. :stupid: 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. :D Zitat:
Delphi-Quellcode:
in
Ergebnis
Delphi-Quellcode:
finden, obwohl der Wert eigentlich
xXx=abc=Ergebnis
Delphi-Quellcode:
wäre.
abc=Ergebnis
Gut, wenn man ausschließt, dass dort ein
Delphi-Quellcode:
drin vorkommt, dann reicht EndsStr aus.
=
Man müsste also auch noch prüfen, sodass vor dem Gefundenen kein weiteres
Delphi-Quellcode:
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. |
AW: Stringliste indexOfName IndexofValue
Diese Funktion reicht doch, das er sehr performant sein muss habe ich hier nicht heraus gelesen
Code:
Wenn man die TStrings als TStringList anlegt kann man auch davor strList.Sort verwenden.
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; Die TStrings sollten mit TStringList erstellt werden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz