【问题标题】:String Builder vs Lists字符串生成器与列表
【发布时间】:2012-04-09 16:37:49
【问题描述】:

我正在读取数百万行的多个文件,并且我正在创建一个包含特定问题的所有行号的列表。例如,如果特定字段留空或包含无效值。

所以我的问题是什么是最有效的日期类型来跟踪可能超过一百万行的数字列表。使用 String Builder、Lists 或其他东西会更有效吗?

我的最终目标是输出一条消息,例如“特定字段在 1-32、40、45、47、49-51 等处为空白。所以对于字符串生成器,我会检查之前的值如果它只有 1 个,我会将其从 1 更改为 1-2,如果超过一个,则用逗号将其分隔。使用列表,我只需将每个数字添加到列表中,然后组合一次该文件已被完全读取。但是在这种情况下,我可以有多个包含数百万个数字的列表。

这是我使用 String Builder 组合数字列表的当前代码:

string currentLine = sbCurrentLineNumbers.ToString();
string currentLineSub;

StringBuilder subCurrentLine = new StringBuilder();
StringBuilder subCurrentLineSub = new StringBuilder();

int indexLastSpace = currentLine.LastIndexOf(' ');
int indexLastDash = currentLine.LastIndexOf('-');

int currentStringInt = 0;

if (sbCurrentLineNumbers.Length == 0)
{
    sbCurrentLineNumbers.Append(lineCount);
}
else if (indexLastSpace == -1 && indexLastDash == -1)
{
    currentStringInt = Convert.ToInt32(currentLine);

    if (currentStringInt == lineCount - 1)
        sbCurrentLineNumbers.Append("-" + lineCount);
    else
    {
        sbCurrentLineNumbers.Append(", " + lineCount);
        commaCounter++;
    }
}
else if (indexLastSpace > indexLastDash)
{
    currentLineSub = currentLine.Substring(indexLastSpace);
    currentStringInt = Convert.ToInt32(currentLineSub);

    if (currentStringInt == lineCount - 1)
        sbCurrentLineNumbers.Append("-" + lineCount);
    else
    {
        sbCurrentLineNumbers.Append(", " + lineCount);
        commaCounter++;
    }
}
else if (indexLastSpace < indexLastDash)
{
    currentLineSub = currentLine.Substring(indexLastDash + 1);
    currentStringInt = Convert.ToInt32(currentLineSub);

    string charOld = currentLineSub;
    string charNew = lineCount.ToString();

    if (currentStringInt == lineCount - 1)
        sbCurrentLineNumbers.Replace(charOld, charNew);
    else
    {
        sbCurrentLineNumbers.Append(", " + lineCount);
        commaCounter++;
    }
}   

【问题讨论】:

标签: c# string visual-studio-2010 list stringbuilder


【解决方案1】:

我的最终目标是输出一条消息,例如“1-32、40、45、47、49-51 上的特定字段为空白

如果这是最终目标,那么通过 List&lt;int&gt; 之类的中介表示毫无意义 - 只需使用 StringBuilder。这样可以节省内存和 CPU。

【讨论】:

  • 请注意,使用这样的解决方案将其更改为做其他任何事情都会相当困难。将字符串解析回数字是可行的,因此如果您需要将数字作为整数,则需要重构代码以使用List&lt;int&gt;。如果您知道这不会成为问题,或者重构足够简单,那么 SB 就可以了。
  • 目前,我没有任何计划需要将字符串重新解析为数字。帮助文件所有者更正他们的问题。
  • 看看你是否可以在你的设计中加入足够的弹性,比如请求根据你的输出浏览文件。可能超出范围,但您可以很容易地看到它是一项被请求的功能。
【解决方案2】:

StringBuilder 服务于您的目的,所以坚持下去,如果您需要行号,那么您可以轻松更改代码。

【讨论】:

    【解决方案3】:

    取决于您可以/想要如何分解代码。

    鉴于您是按行顺序阅读的,因此完全不确定是否需要列表。 您当前所需的输出意味着在完全扫描文件之前您无法输出任何内容。文件的大小表明一次性分析阶段也是一个好主意,因为您将使用缓冲输入而不是将整个内容读入内存。

    我很想用枚举来描述问题,例如字段???是空白的,然后将其用作字符串生成器字典的键。

    首先想到的是

    【讨论】:

      【解决方案4】:

      你的输出应该是人类可读的吗?如果是这样,在您的数据结构出现任何性能/内存问题之前,您将达到合理阅读的极限,long。使用最容易使用的方法。

      如果输出应该是机器可读的,那么该输出可能会建议适当的数据结构。

      【讨论】:

        【解决方案5】:

        正如其他人所指出的,我可能会使用StringBuilder。列表可能需要多次调整大小StringBuilder 的新实现不必调整大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 2013-08-29
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 2016-04-21
          相关资源
          最近更新 更多