字符串生成器与列表
本文关键字:列表 字符串 | 更新日期: 2023-09-27 18:30:35
我正在读取数百万行的多个文件,并且我正在创建具有特定问题的所有行号的列表。例如,如果特定字段留空或包含无效值。
所以我的问题是,跟踪可能超过一百万行的数字列表的最有效日期类型是什么。使用字符串生成器、列表或其他东西会更有效吗?
我的最终目标是发出一条消息,例如"1-32、40、45、47、49-51 等上的特定字段为空。因此,在字符串生成器的情况下,我会检查以前的值,如果它只是多 1,我会将其从 1 更改为 1-2,如果它不止一个,则用逗号分隔。使用列表,我只需将每个数字添加到列表中,然后在文件完全读取后进行合并。但是在这种情况下,我可以有多个包含数百万个数字的列表。
以下是我用来使用字符串生成器组合数字列表的当前代码:
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++;
}
}
我的最终目标是发出一条消息,例如"特定字段在 1-32、40、45、47、49-51 上为空
如果这是最终目标,那么通过诸如List<int>
之类的中介表示就没有意义了 - 只需使用StringBuilder
即可。这样您将节省内存和CPU。
StringBuilder 可以满足您的目的,因此请坚持使用,如果您需要行号,您可以轻松更改代码。
取决于你如何/想要分解代码。
鉴于您正在按行顺序阅读它,因此不确定您是否需要一个列表。您当前所需的输出意味着在文件完全扫描之前无法输出任何内容。文件的大小表明,一次通过分析阶段也是一个好主意,因为您将使用缓冲输入,而不是将整个内容读入内存。
我会想用一个枚举来描述这个问题,例如 Field??? 是空白的,然后将其用作字符串生成器字典的键。
无论如何,作为第一个想法
正如其他人指出的那样,我可能会使用 StringBuilder
.列表可能必须多次调整大小;StringBuilder
的新实现不必调整大小。
你的输出应该是人类可读的吗? 如果是这样,您将达到合理读取的极限,早在数据结构出现任何性能/内存问题之前。 使用您最容易使用的任何内容。
如果输出应该是机器可读的,那么该输出可能建议适当的数据结构。