2 Stimmen

Ersetzen einer Regex-Match-Sammlung in C#

Ich muss in einem Text alles finden, was mit [ beginnt und mit ] endet, und es durch den Wert ersetzen, den eine Funktion zurückgibt. Hier ist also ein Beispiel für das, was ich tue:

    public string ProcessTemplate(string input)
    {
        return Regex.Replace(input, @"\[(.*?)\]", new MatchEvaluator(delegate(Match match)
            {
                return ProcessBlock(match.Result("$1"));
            }));
    }

    public string ProcessBlock(string value)
    {
        return Block.FromString(value).Process();
    }

Mein Problem ist jetzt, dass ich Blöcke bearbeiten muss. Also dachte ich, ich suche Blöcke, bearbeite sie, und puis sie im Text zu ersetzen.

Also erstellte ich eine Liste von Blöcken und trennte die ProcessTemplate Methode auf zwei Methoden: FindBlocks y ReplaceBlocks :

    public void FindBlocks(string input)
    {
        Input = input;

        foreach (Match match in Regex.Matches(input, @"\[(.*?)\]"))
            Blocks.Add(Block.FromString(match.Result("$1")));
    }

    public string ReplaceBlocks()
    {
        string input = Input;

        foreach (Block block in Blocks)
            input = input.Replace("[" + block.OrginalText + "]", block.Process);

        return input;
    }

    public IList<Block> Blocks
    {
        get;
        set;
    }

    public string Input
    {
        get;
        set;
    }

Es funktioniert zwar, aber das Problem ist, dass es ziemlich langsam ist. Ich habe gemessen mit System.Diagnostics.Stopwatch jedes Teil, und ich fand heraus, dass die String.Replace im ReplaceBlocks Methode ist ziemlich langsam.

Wie kann ich sie verbessern?

Gracias.

2voto

Mekboy Punkte 126

Ersetzen der Zeichenfolge in ReplaceBlock mit einem StringBuilder kann eine Leistungssteigerung bieten, wie jedes Mal, wenn Sie eine string.replace durchführen es die Zeichenfolge deallocate und neu zuweisen muss die Zeichenfolge.

Ersetzen Sie den Inhalt des ReplaceBlocks durch den folgenden Text.

// This will require a reference to System.Text
StringBuilder input =new StringBuilder(Input);
  foreach (Block block in Blocks)
  {
    input = input.Replace("[" + block.OrginalText + "]", block.Process);
  }
  return input.ToString();

Ich habe auch festgestellt, dass das Ersetzen der foreach-Schleifen durch eine for-Schleife schneller ist.

0voto

kevingessner Punkte 17749

Ich denke, es ist langsam

Optimieren Sie nicht, bevor Sie ein Profil erstellt haben. Finden Sie heraus, warum Ihr Code langsam ist, und optimieren Sie dann diese Teile.

http://c2.com/cgi/wiki?ProfileBeforeOptimizing

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X