Bei Result := S;
wird ein neuer String erzeugt und S in Result kopiert.
Das stimmt nicht ganz. Mit der Zuweisung wird zunächst nur der Referenzzähler des Strings erhöht. Erst wenn eine Änderung in Result erfolgt wird ein neuer String angelegt und der Inhalt kopiert.
Bei SetLength(Result, LastPos-1);
wird dann noch einmal ein neuer String erzeugt und wieder alles kopiert.
Stimmt auch nur dann, wenn die neue Länge größer ist als die alte, was aber in diesem Fall gar nicht vorkommen kann.
Werden also keine Zeichen gelöscht, erfolgt auch kein Erzeugen eines neuen Strings. Andernfalls hat man auch nur einen String-Kopiervorgang. Wollte man auch den vermeiden, müsste man den OriginalString manipulieren. Dazu müsste S als var-Parameter deklariert werden und alle result durch S ersetzt werden. Die Zuweisung kann dann natürlich entfallen.
Delphi-Quellcode:
procedure RemoveCharsEx(var S: string; const Chars: string); // Chars CaseSensitive;
var
I, Index: integer;
Skip: array[Char] of boolean;
StartPos, LastPos: Integer;
begin
FillChar(Skip[#0], Length(Skip) * SizeOf(Skip[#0]), 0);
for I := 1 to Length(Chars) do
Skip[Chars[I]] := true;
StartPos := -1;
for i := 1 to length (s) do // Prüfen, ob Text zu ersetzende Zeichen enthält
if skip[S[i]] then begin
StartPos := i;
LastPos := i;
break;
end;
if StartPos = -1 then exit; // [1] Text enthielt keine zu ersetzenden Zeichen
for I := StartPos to Length(S) do
if not Skip[S[I]] then
begin
S[LastPos] := S[I];
Inc(LastPos);
end;
SetLength(S, LastPos-1);
end;