Delphi-Quellcode:
function AppendStringIfUnique(StrToChange: String; StrToAppend: String;
SepChar: Char): String;
begin
Result := StrToChange;
StrToAppend := StrToAppend + SepChar;
If pos(SepChar + StrToAppend, StrToChange) = 0 then
begin
If Length(Result) = 0 then Result := SepChar;
Result := Result + StrToAppend;
end;
end;
ist auf meinem Rechner ca. um den Faktor 10 schneller, hat aber den Nachteil, dass der Zielstring mit einem Seperator beginnen muss. Falls das nichts ist, habe ich hier noch einen Nachbau deiner Funktion, der zwar mehr Speicher verbraucht, aber um ca. 20% schneller ist (trotzdem noch sehr langsam).
Delphi-Quellcode:
function AppendStringIfUnique(StrToChange: String; StrToAppend: String;
SepChar: Char; WatchCase: Boolean = false): String;
var iNextSepIdx: Integer;
sWord: String;
sSrcStr, sDestStr: String;
iSrcStrLength, iDestStrLength: Integer;
begin
Result := StrToChange;
If (Length(StrToChange)=0) or (Length(StrToAppend)=0) then
begin
Result := StrToAppend;
end
else begin
If (not WatchCase) then
begin
//Speicher opfern, dafür den Vergleich bei Nichtbeachtung von
//Groß/Kleinschreibung beschleunigen
sSrcStr := AnsiLowercase(StrToChange);
sDestStr := AnsiLowercase(StrToAppend);
end
else begin
sSrcStr := StrToChange;
sDestStr := StrToAppend;
end;
iSrcStrLength := Length(sSrcStr);
iDestStrLength := Length(sDestStr);
iNextSepIdx := 1;
SetLength(sWord, 0);
//Prüfen, ob das Wort schon enthalten ist, wenn ja die Funktion beenden
while (iNextSepIdx + iDestStrLength -1 <= iSrcStrLength) do
begin
//Nächstes Wort besorgen und prüfen
while (sSrcStr[iNextSepIdx] <> SepChar)
and (iNextSepIdx < iSrcStrLength) do inc(iNextSepIdx);
inc(iNextSepIdx);
sWord := copy(sSrcStr, iNextSepIdx, iDestStrLength);
If (sWord = sDestStr) then exit;
end;
//Wenn wir hier ankommen ist das Wort nicht im Quellstring enthalten
Result := Result + SepChar + StrToAppend;
end;
end;
[edit="Dani"]Delphi-Tags gesetzt[/edit]
Dani H.
At Least I Can Say I Tried