2012-04-09 86 views
0

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

所以我的问题是什么是最有效的日期类型跟踪号码的清单,可能是向上百万的行数的。会使用字符串生成器,列表或其他更有效的?

我的最终目标是要出把像“特定字段的消息是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++; 
    } 
} 
+0

[将列表转换为数字范围字符串](http://stackoverflow.com/questions/7688881/convert-list-to-number-range-string) – 2012-04-09 16:51:35

回答

3

我的最终目标是要放出来的消息,如“特定字段为空在1-32,40,45,47,49-51

如果这是最终目标,在经过去没有意义中间表示,例如List<int> - 只需要输入StringBuilder即可。您将以这种方式节省内存和CPU。

+0

请注意,使用类似这样的解决方案将其更改为执行其他任何操作会比较困难。将字符串解析回数字将是工作,所以如果你需要这些数字作为整数,你需要使用一个'List '来代码。如果你知道这不会是一个问题,或者refacor足够简单,那么SB是好的。 – Servy 2012-04-09 17:09:11

+0

目前,我没有任何计划需要将字符串重新解析为数字。这是更多的东西来协助文件的所有者,以便他们可以纠正他们的问题。 – buzzzzjay 2012-04-09 17:25:34

+0

看看你是否可以将足够的灵活性放入你的设计中,比如根据你的输出来请求浏览文件。可能超出范围,但这是一个功能,你可以很容易地看到被请求。 – 2012-04-09 21:03:43

1

StringBuilder的服务你的目的,从而与坚持,如果你需要的行号,你可以很容易地更改代码即可。

2

取决于您如何/想要打破代码。

鉴于您正在阅读它的线序,不知道你需要一个名单都没有。 您当前所需的输出意味着在文件完全扫描之前您不能输出任何内容。文件的大小意味着一次通过分析阶段也是一个好主意,因为你将使用缓冲输入而不是将整个事物读入内存。

我会试图用枚举来描述问题,例如字段?是空白的,然后用它作为字符串构建器的字典。

作为第一个想到反正

2

是您的输出应该是人类可读?如果是这样,那么在您的数据结构中存在任何性能/内存问题之前,您将达到合理的读取限制,即long。使用最简单的方法来处理。

如果输出被认为是机器可读的,则该输出可能暗示适当的数据结构。

1

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