Das Problem ist, dass man die gesamte Zeichenfolge Größe zweimal iterieren (ein für den Ersatz & gt; von> und eine anderen & lt zu ersetzen, durch <).
Sie sollten iterieren mit einem für und einfach im Voraus überprüfen, wenn Sie eine & für ein GT finden; oder lt; und die sofortige ersetzen und dann überspringen 3 Zeichen ((g | l) t;). Auf diese Weise kann es in proportionaler Zeit zu der Größe der Zeichenfolge xml.Text.
Ein einfaches C# Beispiel, wie ich Delphi nicht kenne, aber tun sollte, um die allgemeine Idee zu bekommen.
String s = "<xml>test</xml>";
char[] input = s.ToCharArray();
char[] res = new char[s.Length];
int j = 0;
for (int i = 0, count = input.Length; i < count; ++i)
{
if (input[i] == '&')
{
if (i < count - 3)
{
if (input[i + 1] == 'l' || input[i + 1] == 'g')
{
if (input[i + 2] == 't' && input[i + 3] == ';')
{
res[j++] = input[i + 1] == 'l' ? '<' : '>';
i += 3;
continue;
}
}
}
}
res[j++] = input[i];
}
Console.WriteLine(new string(res, 0, j));
Diese Ausgänge:
<xml>test</xml>
Können Sie wie jede Rückmeldung auf Original-Code spped vs Jorge Code vs FastStrings bekommen? – gabr
Das Problem mit StringReplace ist, wenn Sie viele Vorkommen haben, die ersetzt werden müssen. Für diesen Fall sollten Sie Ihre eigene Version schreiben, ähnlich der, die Gabr gepostet hat. Das Problem besteht darin, StringReplace nicht zweimal aufzurufen, sondern Dutzende von Ersatzoperationen zu verarbeiten. –