Windows Forms C# 응용 프로그램에서 사용자가 로그 데이터를 붙여 넣은 텍스트 상자가 있고 정렬됩니다. 개별 라인을 개별적으로 검사하여 새 라인으로 입력을 분할해야하지만, 100,000 개가 넘는 많은 행이 있으면 OutOfMemoryException이 발생합니다.문자열 배열이 큰 여러 줄 항목에 대해 OutOfMemoryException을 throw합니다.
내 코드는 다음과 같습니다
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 문을 사용할 수 있다는 것을 몰랐다. 파스칼하고 기본적이고 재미있는 게임을 한 아이 였을 때부터 사용하지 않았다고 생각하지 않는다.이것은 지나치게 복잡해 보이지만 제 질문에 대한 업데이트를 살펴보십시오. –
내 답변 끝에 메모를 추가했습니다. 귀하의 업데이트는 깨끗하지만'\ r \ n'과'\ n'을 끝 줄로 처리하지 않습니다. 만약 당신이 그걸로 도망 갈 수 있다면 괜찮아요. - 나는 여전히 StringBuilder를 사용하여 (큰?) 중간 문자열 목록을 만드는 것을 피하는 것이 좋습니다. – MiMo
예,'goto'는 C#에서 가능하며,이 경우처럼 - sparingly - 사용합니다. – MiMo