2012-04-09 105 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的新實現不必調整大小。