2012-03-24 10 views
2

OK Leute, ich erstelle eine Klasse, die grundsätzlich mit einer RichTextBox in C# .net interagieren muss. Eine seiner Hauptfunktionen besteht darin, zu erkennen, ob der Benutzer ein spezielles Wort eingegeben hat. Wenn es eine Übereinstimmung findet, muss es die Farbe des Wortes ändern (wie in der Textverarbeitung).Effizienter Ansatz für konstante Änderung von Text

Die Sache ist, dass ich nicht sicher bin, wie man es effizient macht, weil ich immer nach einer Suche suche, wenn der Text in der RTB (RichTextBox) geändert wird, aber zu ineffizient wäre das gesamte RTB jedes Mal, wenn der Benutzer ein neues Wort eingibt (wenn man berücksichtigt, dass der Text in der RTB lang ist).

Ich habe einen Weg gefunden, um das letzte in der RTB eingegebene Zeichen zu erhalten und festzustellen, ob ein Wort gebildet wurde und dann zu prüfen, ob es ein spezielles Wort war, aber das Problem ist, wenn der RTB-Text durch Funktionen oder durch Einfügen geändert wird Text dann würde es nicht funktionieren. Also muss ich berücksichtigen, dass der RTB-Text auf viele Arten modifiziert werden kann.

Also wäre es effizient, eine vollständige Suche in der RTB jedes Mal, wenn der Text geändert wird, um die speziellen Wörter zu finden? (unter Berücksichtigung, dass der Text darauf lang sein könnte) oder gibt es einen anderen Ansatz, an den ihr denkt?

EDIT: ----------------------------

Nun, wenn jemand interessiert ich einen Weg gefunden zu lösen das Problem.

Ich habe eine Ganzzahl in meiner Klasse verwendet, um die aktuelle Auswahlposition (die aktuelle oder letzte bekannte Position des Cursors in der RTB) zu verfolgen, indem sie jedes Mal aktualisiert wurde, wenn die Auswahl in der RTB mit dem Ereignis RichTextBox_SelectionChanged geändert wurde. Wie folgt aus:

private void richTextBox1_SelectionChanged(object sender, EventArgs e) 
{ 
    LastCursorPosition = CurrentCursorPosition; 
    CurrentCursorPosition = richTextBox1.SelectionStart; 
    CursorsDifferences = CurrentCursorPosition - LastCursorPosition; 

} 

dies, dass CurrentCursorPosition sicherzustellen, jedesmal, wenn der Benutzer ein Zeichen oder ändert den Text in der RTB und LastCursorPosition halten wird aktualisiert werden, auch habe ich es zu sagen? Dann werden die Unterschiede in den Cursorpositionen auf CursorsDifferences auf diese Weise gespeichert, wenn der Benutzer etwas in die RTB CursorsDifferences eingefügt hat, wird Ihnen die Länge der eingefügten Zeichenfolge mitgeteilt. Basierend darauf können Sie die Suche von LastCursorPosition zu CurrentCursorPosition durchführen.

HINWEIS: von LastCursorPosition zu CurrentCursorPosition Suche möglicherweise nicht genau sein, weil LastCursorPosition Sie die vorherige ' ‚(whitesapce) oder‚\ n‘(Newline) und die Position erhalten finden müssen, könnten daher nicht der Anfang eines Wortes sein des Zeichens vor einem '' oder '\ n' und die Suche basierend auf der Position, das gleiche gilt für CurrentCursorPosition.

+0

Wie viele spezielle Wörter gibt es? Haben Sie die vollständige Suche, die Sie beschrieben haben, ausprobiert und verifiziert, dass sie schlecht abschneidet? –

+0

@CaseyWilkins Wie benchst du es? Was wäre schlechte Leistung? Im Gegensatz zu was? –

+1

@torrentialcoding, Letztlich muss das OP entscheiden, was für seine spezifische Anwendung als schlechte Leistung gilt. Wenn wir nur nach einer Reihe von "speziellen" Wörtern suchen und diese Menge klein ist, dann ist es vielleicht vollkommen in Ordnung (und schnell), die Zeichenfolge im Textfeld mit einer Liste von Werten für eine Übereinstimmung zu vergleichen. –

Antwort

0

Nun, falls jemand interessiert ist, habe ich einen Weg gefunden, das Problem zu lösen.

Ich habe eine Ganzzahl in meiner Klasse verwendet, um die aktuelle Auswahlposition (die aktuelle oder letzte bekannte Position des Cursors in der RTB) zu verfolgen, indem sie jedes Mal aktualisiert wurde, wenn die Auswahl in der RTB mit dem Ereignis RichTextBox_SelectionChanged geändert wurde. Wie folgt aus:

private void richTextBox1_SelectionChanged(object sender, EventArgs e) 
{ 
    LastCursorPosition = CurrentCursorPosition; 
    CurrentCursorPosition = richTextBox1.SelectionStart; 
    CursorsDifferences = CurrentCursorPosition - LastCursorPosition; 

} 

dies, dass CurrentCursorPosition sicherzustellen, jedesmal, wenn der Benutzer ein Zeichen oder ändert den Text in der RTB und LastCursorPosition halten wird aktualisiert werden, auch habe ich es zu sagen? Dann werden die Unterschiede in den Cursorpositionen auf CursorsDifferences auf diese Weise gespeichert, wenn der Benutzer etwas in die RTB CursorsDifferences eingefügt hat, wird Ihnen die Länge der eingefügten Zeichenfolge mitgeteilt. Basierend darauf können Sie die Suche von LastCursorPosition nach CurrentCursorPosition durchführen.

HINWEIS: Die Suche von LastCursorPosition zu CurrentCursorPosition ist möglicherweise nicht korrekt, da LastCursorPosition möglicherweise NICHT der Anfang eines Wortes ist. Daher müssen Sie das vorherige '' (Whitesapce) oder '\ n' (Newline) finden und die Position von das Zeichen vor einem '' oder '\ n' und die Suche basierend auf der Position, das gleiche gilt für CurrentCursorPosition.

Verwandte Themen