有没有办法将Console.ReadLine保留在内存中,以便以后在C#中引用?

时间:2013-09-14 16:30:09

标签: c# memory-management console.readline

我想写一个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()上都有一个“!” +输入一个字母或只是一个“^”。如果输入“^”,则删除stringbuilder的第一个索引char以及“^”。如果一个 ”!”进入,只是“!”被删除,但信仍然存在。

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

bleh.Replace(counter, 1)

获取索引值有点棘手,因为stringbuilder的大小正在增长和缩小,具体取决于输入的值。

这提出了一个有趣的问题:“StringBuilder.Replace(”abc“,”a“)是如何完成的?对于一个长度为10,000个字符的字符串,它是从字符串的开头搜索的吗?滚动“通过它找到”abc“?因为.Append方法正在放置”!2“,例如,最后,性能会受到影响。

是否有一个简单的答案可以提高性能?

1 个答案:

答案 0 :(得分:1)

似乎!^在输入时被替换。也就是说,超出当前输入行,这些字符在StringBuilder bleh中根本不会出现。

如果是这种情况,那么您只需要在当前输入字符串中搜索/替换。

meh = Console.ReadLine();

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

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

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

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