3

文字配列定義を返すプログラムがあるとします。これをコピーして他の C# コードに貼り付けることができます。考えられる結果の 1 つは、次の文字列です。

// Current output:
return "CharArray = { {}, {123}, {}, {3 3}, {111}, {}, {}" + "};";

ここで、CharArray の末尾にある余分な空行を削除し、先頭または中間に空行を残します。

// Desired output:
"CharArray = { {}, {123}, {}, {3 3}, {111}" + "};";

(スペースの理由から、データの前または間の空行は必要ですが、最後の空スペースはコードにとって何の役にも立ちません。)

最後のブラケットとセミコロンは操作が終わるまで追加されないため、これを行う最も簡単な方法は、文字列から", {}"の末尾のインスタンスをすべて削除することです。私の現在の解決策は、置き換えとトリムの非常に独創的な組み合わせです...

// Red-Green solution:
return output.Replace(", {}", "!").TrimEnd('!').Replace("!", ", {}") + "};";

...確かに正しい結果が返されますが、長くて読者を混乱させ、最初に読んだときにうんざりする可能性が最も高い.

また、この種の問題に通常使用する Regex.Replace は、空の行を 1 つだけ削除します (文字列の末尾に 1 つしか存在しないため)。

// Sub-par solution: (birdie solution?)
 return Regex.Replace(testString, ", {}$", "") + "};";

文字列の末尾のみから一連の文字のすべてのインスタンスを削除するにはどうすればよいですか? 読みやすく、遅すぎず、マシンに負担をかけない結果が望ましいです。(ユーザーが現在知ることができる限り、ボタンを押すとすぐに戻ります。)

4

3 に答える 3

1

正規表現を使用できます:

return "\n" + Regex.Replace(testString, "(, {})+$", "") + "};";

これにより、検索された文字列の複数のオカレンスも置き換えられます

+演算子とは、前の式が1回または複数回出現することを意味します。

于 2012-07-30T16:11:16.903 に答える
0

私はそれを試してみました、TrimEndMultipleは20倍高速です:

    [MethodImplAttribute(MethodImplOptions.NoInlining)] 
    static string TrimEndMutiple(string str, string end)
    {
        int lenend = end.Length;

        int start = str.Length - lenend;

        while (String.CompareOrdinal(str, start, end, 0, lenend) == 0)
        {
            start -= lenend;
        }

        return str.Substring(0, start + lenend);
    } 

    static void Main(string[] args)
    {
        string s = "CharArray = { {}, {123}, {}, {3 3}, {111}, {}, {}";

        Regex reg = new Regex("(, {})+$", RegexOptions.Compiled);

        string s1 = reg.Replace(s, "");
        string s2 = TrimEndMutiple(s, ", {}");

        Stopwatch watch = new Stopwatch();

        int count = 1000 * 100;

        watch.Start();

        for (int i = 0; i < count; i++)
        {
            s1 = reg.Replace(s, "");
        }

        watch.Stop();

        Console.WriteLine("{0} {1,9:N3} ms", s1, watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency);

        watch.Restart();

        for (int i = 0; i < count; i++)
        {
            s2 = TrimEndMutiple(s, ", {}"); 
        }

        watch.Stop();

        Console.WriteLine("{0} {1,9:N3} ms", s2, watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency);
    }

結果:

CharArray = { {}, {123}, {}, {3 3}, {111}   298.014 ms
CharArray = { {}, {123}, {}, {3 3}, {111}    15.495 ms
于 2012-08-01T17:36:28.357 に答える
0

これを試して:

    string TrimEndMultiple(string str, string end)
    {
        int lenend = end.Length;

        int start = str.Length - lenend;

        while (String.CompareOrdinal(str, start, end, 0, lenend) == 0)
        {
            start -= lenend;
        }

        // Addendum:
        return str.Substring(0, start + lenend);
    }
于 2012-07-30T21:26:55.160 に答える