1

シンタックスカラーリングツールを作っています。私は現在、キーワードを見つけて強調表示する方法を書いています.ex if then else..これを行うためのより良い(より速く、より美的な)方法があると確信しています。

以下に 2 つの方法を示します。最初の方法は、速度を向上させるために長さ以外の文字列メソッドを使用しないようにします。

2 番目に文字列メソッドを使用しましたが、最初の方法よりも遅いと言われました。

どちらの方法が速いですか?そして最初のものについては、スペースがその単語の後にある場合にのみ単語が強調表示されますが、それに対する救済策はありますか?

コード:

    private string[] m_keywords = new string[] { "GOTO", "IF", "THEN", "ELSE", "WHILE", "DO" };
    private int m_nShortestKeywordLength = 2;

    // lcpy_strLine is a copy in all uppercase of the current line I am processing

    private void ProcessKeywords(Color clr)
    {
        if(lcpy_strLine.Length > m_nShortestKeywordLength)
            for (int i = 0; i < m_keywords.Length; i++)
            {
                string curWord = m_keywords[i];
                int len = curWord.Length;
                for (int j = 0; j < lcpy_strLine.Length; j++)
                {
                    if (j + len < lcpy_strLine.Length)
                    {
                        int k = 0;
                        while (k < len && lcpy_strLine[j + k] == curWord[k])
                            k++;
                        if (k == len)
                        {
                            Console.WriteLine("Found Keyword");
                            SelectionStart = m_nLineStart + j;
                            SelectionLength = k;
                            SelectionColor = clr;
                        }
                    }
                }
            }
    }

    private void ProcessKeywords2(Color clr)
    {
        /*for (int i = 0; i < m_keywords.Length; i++)
            if (lcpy_strLine.Contains(m_keywords[i]))
            {
                int indx1 = lcpy_strLine.IndexOf(m_keywords[i]);
                SelectionStart = m_nLineStart + indx1;
                SelectionLength = m_keywords[i].Length;
                SelectionColor = clr;
            }*/

    }
4

2 に答える 2

1

これを行う最も簡単な方法は、おそらく正規表現でしょう。それもかなり速いでしょう。

private string[] m_keywords = new string[] { "GOTO", "IF", "THEN", "ELSE", "WHILE", "DO" };
private Regex keywordRegex = new Regex(@"\b(" + string.Join("|", m_keywords) + @")\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);

そして、行を大文字にする必要はありません:

private void ProcessKeywords(Color clr)
{
    foreach (Match m in keywordRegex.Matches(someLine)) {
        SelectionStart = m.Index;
        SelectionLength = m.Length;
        SelectionColor = clr;
    }
}
于 2012-08-21T17:17:58.513 に答える
0

を使用する場合は、良好なパフォーマンスを得るためstring.IndexOfに指定する必要があります。StringComparison.Ordinalデフォルトのオーバーロードは、カルチャを意識した比較を使用します (たとえば、"æ" は "ae" と等しいと見なされます)。これは、単純な文字ごとの比較よりもはるかにコストがかかります。

于 2012-08-21T17:11:34.723 に答える