在Windows Forms C#應用程序中,我有一個用戶粘貼日誌數據的文本框,並對它進行排序。我需要單獨檢查每一行,以便按新行分割輸入,但如果有大量行數超過100,000行,則會引發OutOfMemoryException。字符串數組爲大型多行條目拋出OutOfMemoryException
我的代碼如下所示:
StringSplitOptions splitOptions = new StringSplitOptions();
if(removeEmptyLines_CB.Checked)
splitOptions = StringSplitOptions.RemoveEmptyEntries;
else
splitOptions = StringSplitOptions.None;
List<string> outputLines = new List<string>();
foreach(string line in input_TB.Text.Split(new string[] { "\r\n", "\n" }, splitOptions))
{
if(line.Contains(inputCompare_TB.Text))
outputLines.Add(line);
}
output_TB.Text = string.Join(Environment.NewLine, outputLines);
的問題來自當我分裂一行文本框中的文字,這裏input_TB.Text.Split(new string[] { "\r\n", "\n" }
有沒有更好的方式來做到這一點?我已經考慮過採用第一個X數量的文本,截斷一個新行並重復,直到所有內容都被讀取,但這似乎很乏味。或者有沒有辦法爲它分配更多的內存?
感謝, 加勒特
更新
感謝阿提拉,我想出了這一點,它似乎工作。由於
StringReader reader = new StringReader(input_TB.Text);
string line;
while((line = reader.ReadLine()) != null)
{
if(line.Contains(inputCompare_TB.Text))
outputLines.Add(line);
}
output_TB.Text = string.Join(Environment.NewLine, outputLines);
我甚至不知道你可以在C#中使用goto語句,不要以爲我曾經使用過一個,因爲我是一個孩子玩pascal和基本的,有趣的。這似乎過於複雜,但看看我的問題的更新。 –
我在回答結尾處添加了一個註釋 - 您的更新比較乾淨,但不能同時處理'\ r \ n'和'\ n'作爲結束行。如果你可以避免這種情況 - 那麼我仍然建議使用'StringBuilder',避免創建一個(大?)中間字符串列表。 – MiMo
是的,'goto'可以在C#中使用,並且在這種情況下我謹慎使用它們。 – MiMo