none
Wie kann man den Code Optimieren / verändern? RRS feed

  • Frage

  • char[] parts = TextBox.Text.ToCharArray();
    
    TextBox.Text = "";
    
    foreach (char part in parts)
    {
        if (part == '(' || part == ')' || part == '[' || part == ']'
            || part == '{' || part == '}' || part == '<' || part == '>')
        {
            TextBox.SelectionColor = Color.FromArgb(0, 0, 175);
            TextBox.AppendText(part.ToString());
        }
        else if (part == '\"' || part == '\'')
        {
            TextBox.SelectionColor = Color.FromArgb(175, 0, 0);
            TextBox.AppendText(part.ToString());
        }
        else if (part == '/' || part == '+' || part == '-' || part == '*' || Regex.IsMatch(part.ToString(), "[0-9]"))
        {
            TextBox.SelectionColor = Color.FromArgb(0, 175, 0);
            TextBox.AppendText(part.ToString());
        }
        else
        {
            TextBox.SelectionColor = Color.FromArgb(0, 0, 0);
            TextBox.AppendText(part.ToString());
        }
    }
    
    Mit diesem Code färbe ich einzelne Zeichen in einer richTextBox ein. Mein Problem ist, das jedes mal der gesammte Inhalt der Textbox gelöscht wird und somit die Verarbeitungsgeschwindigkeit bei großen Texten extrem langsamm wird. Außerdem würde ich gerne ganze Textgruppen nach einem bestimmten Schema einfärben z.B.:
    string text = "/ * - + \' \" { [ ( < > ) ] }ABCDEFGHIJKLMNOPQRTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 [01.12.2011 13:14:15]";
    string pattern = "\[\d{2}.\d{2}.\d{2} \d{2}:\d{2}:\d{2}\]";
    
    Regex.IsMatch(text, pattern);
    

    Wie kann ich sowas am besten realisieren.

    PS: stimmt das so "\[" wenn man nach eckigen Klammern in den "pattern" sucht?


    Koopakiller - http://koopakiller.ko.ohost.de/
    Samstag, 10. Dezember 2011 20:51

Antworten

  • Du hast zu viele Konstructors und ToString(). Konstruct die Farben nul einmal, und lass den text in der Box.

    Color blau = Color.FromArgb(0, 0, 175);
    Color gruen = Color.FromArgb(0, 175, 0);
    Color rot = Color.FromArgb(175, 0, 0);
    Color schwarz= Color.FromArgb(0, 0, 0);
    
    string parts = TextBox.Text;
    
    
    for(int i = 0; i < parts.Length; i++)
    {
        char part = parts[i];
        TextBox.Select(i, 1);
        if (part == '(' || part == ')' || part == '[' || part == ']'
            || part == '{' || part == '}' || part == '<' || part == '>')
        {
            TextBox.SelectionColor = blau;
        }
        else if (part == '\"' || part == '\'')
        {
            TextBox.SelectionColor = rot;
        }
        else if (part == '/' || part == '+' || part == '-' || part == '*' || Regex.IsMatch(part.ToString(), "[0-9]"))
        {
            TextBox.SelectionColor = gruen;
        }
        else
        {
            TextBox.SelectionColor = schwarz;
        }
    }

     

     

     

    • Als Antwort markiert KK Senior Dienstag, 13. Dezember 2011 14:58
    Sonntag, 11. Dezember 2011 01:10
  • Zusätzlich zu den Tipps von Ante ändere die if-statements in switch-case-Anweisungen:

     


    Best Regards. Please Mark Answered, If my solution solves your problem.
    • Als Antwort markiert KK Senior Dienstag, 13. Dezember 2011 14:58
    Sonntag, 11. Dezember 2011 12:32

Alle Antworten

  • Du hast zu viele Konstructors und ToString(). Konstruct die Farben nul einmal, und lass den text in der Box.

    Color blau = Color.FromArgb(0, 0, 175);
    Color gruen = Color.FromArgb(0, 175, 0);
    Color rot = Color.FromArgb(175, 0, 0);
    Color schwarz= Color.FromArgb(0, 0, 0);
    
    string parts = TextBox.Text;
    
    
    for(int i = 0; i < parts.Length; i++)
    {
        char part = parts[i];
        TextBox.Select(i, 1);
        if (part == '(' || part == ')' || part == '[' || part == ']'
            || part == '{' || part == '}' || part == '<' || part == '>')
        {
            TextBox.SelectionColor = blau;
        }
        else if (part == '\"' || part == '\'')
        {
            TextBox.SelectionColor = rot;
        }
        else if (part == '/' || part == '+' || part == '-' || part == '*' || Regex.IsMatch(part.ToString(), "[0-9]"))
        {
            TextBox.SelectionColor = gruen;
        }
        else
        {
            TextBox.SelectionColor = schwarz;
        }
    }

     

     

     

    • Als Antwort markiert KK Senior Dienstag, 13. Dezember 2011 14:58
    Sonntag, 11. Dezember 2011 01:10
  • Zusätzlich zu den Tipps von Ante ändere die if-statements in switch-case-Anweisungen:

     


    Best Regards. Please Mark Answered, If my solution solves your problem.
    • Als Antwort markiert KK Senior Dienstag, 13. Dezember 2011 14:58
    Sonntag, 11. Dezember 2011 12:32
  • Nun gut, so gehts auf jeden fall scho mal schneller, jetzt noch 2 Sachen:

    1.   Wie kann ich überprüfen ob mehrere Zeichen einer bestimmten Syntax entsprechen, ohne jedesmal den Ganzen Text durchsuchen zu müssen? Bei einzelnen Zeichen habe ich es jetzt in der TextBox_KeyPress-Methode probiert.

    2.   Wie kann man bei 2 verschiedenen case-Anweisungen die selbe aktion ausführen? Weil || geht bei case anscheinend nicht. also das hier:

    part == '(' || part == ')'

     


    Koopakiller - http://koopakiller.ko.ohost.de/
    Sonntag, 11. Dezember 2011 15:17
  • Versuche folgendes:

    switch (part)
    {
        case '(':
        case ')':
            doSomething();
    }
    


    Best Regards. Please Mark Answered, If my solution solves your problem.
    Montag, 12. Dezember 2011 09:53