gpt4 book ai didi

c# - 字符串数组为大型多行条目抛出 OutOfMemoryException

转载 作者:行者123 更新时间:2023-12-02 17:49:19 26 4
gpt4 key购买 nike

在 Windows 窗体 C# 应用程序中,我有一个文本框,用户可以在其中粘贴日志数据,并对其进行排序。我需要单独检查每一行,所以我按新行拆分输入,但如果有很多行,超过 100,000 行左右,它会抛出 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 数量的文本,在新行截断并重复直到所有内容都已阅读,但这似乎很乏味。或者有没有办法为它分配更多的内存?

谢谢,加勒特

更新

多亏了 Attila,我才想到这个,而且看起来很管用。谢谢

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);

最佳答案

更好的方法是一次提取和处理一行,然后使用 StringBuilder 来创建结果:

StringBuilder outputTxt = new StringBuilder();
string txt = input_TB.Text;
int txtIndex = 0;
while (txtIndex < txt.Length) {
int startLineIndex = txtIndex;
GetMore:
while (txtIndex < txt.Length && txt[txtIndex] != '\r' && txt[txtIndex] != '\n')) {
txtIndex++;
}
if (txtIndex < txt.Length && txt[txtIndex] == '\r' && (txtIndex == txt.Length-1 || txt[txtIndex+1] != '\n') {
txtIndex++;
goto GetMore;
}
string line = txt.Substring(startLineIndex, txtIndex-startLineIndex);
if (line.Contains(inputCompare_TB.Text)) {
if (outputTxt.Length > 0)
outputTxt.Append(Environment.NewLine);
outputTxt.Append(line);
}
txtIndex++;
}
output_TB.Text = outputTxt.ToString();

先发制人的评论:有人会反对 goto - 但这是这里所需要的,替代方案要复杂得多(例如 reg exp),或者用另一个循环伪造 goto 和继续中断

使用 StringReader 来拆分行是一个更简洁的解决方案 ,但它不能同时处理 \r\n\n 作为新行 :

StringReader reader = new StringReader(input_TB.Text); 
StringBuilder outputTxt = new StringBuilder();
string compareTxt = inputCompare_TB.Text;
string line;
while((line = reader.ReadLine()) != null) {
if (line.Contains(compareTxt)) {
if (outputTxt.Length > 0)
outputTxt.Append(Environment.NewLine);
outputTxt.Append(line);
}
}
output_TB.Text = outputTxt.ToString();

关于c# - 字符串数组为大型多行条目抛出 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com