0

基本的に、「最後の Console.ReadLine() メソッドに入力された内容に "!" が含まれている場合...何かを行う」という if ステートメントを書きたいと思います。

だから、私は方法を持っています:

static void Operations(StringBuilder bleh, int ops, int count, string str)
{
    for (int i = 0; i < ops; i++)
    {
        bleh.Append(Console.ReadLine()); // Potential value of "ops" is > 100,000

        if (bleh.ToString().IndexOf("!") != -1)
        {
            bleh.Replace("!", "");
        }
        else
        {
            bleh.Remove(0, 1);
            bleh.Replace("^", "");
        }
        ...

すべての readLine() には、「!」+ 入力された文字または単に「^」。「^」が入力された場合、stringbuilder の最初のインデックス文字と「^」が削除されます。もし "!" が入力されている場合は、「!」削除されますが、文字は残ります。

ReadLine() から新しい文字列を追加した後、"!" を検索する必要があるため、私のコードは遅いようです。または、ループの反復ごとに潜在的に巨大な文字列の「^」を削除し、再度検索して削除します。「^」と「!」が入力されたため、インデックス値を使用してそれらを置き換えることができました。

bleh.Replace(counter, 1)

入力された値に応じて stringbuilder のサイズが増減するため、ここでインデックス値を取得するのは少し難しいです。

これは興味深い質問をもたらします: "StringBuilder.Replace("abc", "a") のようなものはどのように行われますか? 10,000 文字の長さの文字列の場合、文字列の先頭から検索して「スクロール」しますか? 「abc」を見つけるには? .Append メソッドは、たとえば「!2」を末尾に置いているため、パフォーマンスが低下します。

パフォーマンスを向上させる簡単な答えはありますか?

4

1 に答える 1

1

入力されているように見え、!置き換え^られています。つまり、現在の入力行を超えると、これらの文字は にまったく表示されませんStringBuilder bleh

その場合は、現在の入力文字列を検索/置換するだけで済みます。

meh = Console.ReadLine();

        if (meh.ToString().IndexOf("!") != -1)
            meh.Replace("!", "");

        else
        {
            bleh.Remove(0, 1);
            meh.Replace("^", "");
        }
bleh.Append(meh);

置換を行った後でも、入力行に特定の文字 (または類似の文字) が含まれているかどうかを知る必要がある場合は、それらのListStringsStringBuilder. このようにして、さまざまな入力タイプをさまざまなリストに格納したり、オブジェクトを使用して文字列と一部のメタデータを保持したりできます。

これで十分でない場合は、特殊文字の位置のインデックスを保持する必要があるかもしれません。入力文字列を検索し、関連する文字のインデックス (および StringBuilder の長さ) を取得してから、入力文字列を追加します。後で検索できるように、これらのインデックスをリストに保存します。

于 2013-09-14T17:03:08.683 に答える