0

我想写一个 if 语句,它基本上会说,“如果输入到最后一个 Console.ReadLine() 方法中的内容包含一个“!””......做点什么。

所以,我有一个方法:

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() 上都有一个“!” + 输入一个字母或只是一个“^”。如果输入了“^”,则字符串生成器的第一个索引字符以及“^”都会被删除。如果一个 ”!” 输入,只是“!” 被删除,但字母仍然存在。

我的代码似乎很慢,因为在我从 ReadLine() 附加了一个新字符串之后,它必须搜索“!” 或在循环的每次迭代中可能存在巨大字符串中的“^”,然后再次搜索以将其删除。如果我可以跟踪“^”和“!”的时间会更好。已输入,从而允许我使用索引值替换它们:

bleh.Replace(counter, 1)

在这里获取索引值有点棘手,因为字符串构建器的大小根据输入的值而增长和缩小。

这就提出了一个有趣的问题:“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);

如果您在替换后仍需要知道输入行是否具有特定字符(或类似字符),我建议将这些行存储在 a Listof 中,Strings而不是一起存储在 a 中StringBuilder。这样,您可以将不同的输入类型存储到不同的列表中,或者使用对象来保存字符串和一些元数据。

如果这还不够,那么您可能不得不求助于保留特殊字符位置的索引。搜索输入字符串,获取相关字符的索引(加上 StringBuilder 的长度),然后附加输入字符串。将这些索引存储在列表中以供以后查找。

于 2013-09-14T17:03:08.683 回答