字符串构建器 vs 列表

4

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

所以我的问题是,保持一百万行数量的数字列表的最有效果的数据类型是什么?使用字符串生成器、列表或其他什么东西更有效?

我的最终目标是输出像“第 1-32,40,45,47,49-51 行出现了空白的字段”这样的消息。因此,在使用字符串生成器时,我会检查前一个值,如果只比当前值大1,则将它从 1 改为 1-2,如果大于 1 则用逗号分隔。对于列表,我只需将每个数字添加到列表中,然后在文件完全读取后将它们组合起来。但是在这种情况下,可能会有包含数百万个数字的多个列表。

这是我使用字符串生成器组合数字列表的当前代码:

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++;
    }
}   

将列表转换为数字范围字符串 - L.B
5个回答

6
如果目标是输出“1-32、40、45、47、49-51中某些字段为空”,那么没有必要通过中间表示,例如List<int>,只需使用StringBuilder即可。这样可以节省内存和CPU。

请注意,使用这样的解决方案更改其执行其他操作可能会相当困难。将字符串解析回数字需要一些工作,因此,如果您需要将数字作为整数使用,则需要重构代码以使用“List<int>”。如果您知道这不会成为问题,或者重构足够简单,则SB就可以了。 - Servy
目前,我没有任何计划需要重新解析字符串为数字。这更多是为了帮助文件所有者纠正问题。 - buzzzzjay
看看你的设计是否足够灵活,例如根据输出请求浏览文件。可能超出范围,但这是一个很容易被要求的功能。 - Tony Hopkinson

3
StringBuilder可以满足您的需要,因此请继续使用它。如果您需要行数,可以轻松更改代码。

3
取决于您如何拆分代码。

考虑到您正在按行顺序阅读它,不确定是否需要列表。 您当前想要的输出意味着在文件完全扫描之前无法输出任何内容。给定文件的大小建议一次性分析是一个好主意,因为您将使用缓冲输入而不是将整个文件读入内存。

我倾向于使用枚举来描述问题,例如"字段???"为空,然后将其用作字符串构建器字典的键。

这只是一个初步想法。


3

正如其他人指出的那样,我可能会使用StringBuilder。List可能需要多次调整大小;新的StringBuilder实现不需要调整大小。


2

您的输出是否应该是人类可读的?如果是这样,那么在您遇到任何性能/内存问题之前,您将会遇到阅读上限(很长)。使用对您来说最容易处理的内容。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接