c# – 将大量行写入文本文件的有效方法
发布时间:2020-12-15 08:25:02 所属栏目:百科 来源:网络整理
导读:我开始做以下事情: using (TextWriter textWriter = new StreamWriter(filePath,append)){ foreach (MyClassA myClassA in myClassAs) { textWriter.WriteLine(myIO.GetCharArray(myClassA)); if (myClassA.MyClassBs != null) myClassA.MyClassBs.ToList()
我开始做以下事情:
using (TextWriter textWriter = new StreamWriter(filePath,append)) { foreach (MyClassA myClassA in myClassAs) { textWriter.WriteLine(myIO.GetCharArray(myClassA)); if (myClassA.MyClassBs != null) myClassA.MyClassBs.ToList() .ForEach(myClassB => textWriter.WriteLine(myIO.GetCharArray((myClassB))); if (myClassA.MyClassCs != null) myClassA.MyClassCs.ToList() .ForEach(myClassC => textWriter.WriteLine(myIO.GetCharArray(myClassC))); } } 这似乎很慢(35,000行约35秒). 然后我尝试按照示例here创建一个缓冲区,使用以下代码,但它没有获得任何东西.我仍然看到大约35秒的时间.我是如何实现缓冲区的? using (TextWriter textWriter = new StreamWriter(filePath,append)) { char[] newLineChars = Environment.NewLine.ToCharArray(); //Chunk through 10 lines at a time. int bufferSize = 500 * (RECORD_SIZE + newLineChars.Count()); char[] buffer = new char[bufferSize]; int recordLineSize = RECORD_SIZE + newLineChars.Count(); int bufferIndex = 0; foreach (MyClassA myClassA in myClassAs) { IEnumerable<IMyClass> myClasses = new List<IMyClass> { myClassA } .Union(myClassA.MyClassBs) .Union(myClassA.MyClassCs); foreach (IMyClass myClass in myClasses) { Array.Copy(myIO.GetCharArray(myClass).Concat(newLineChars).ToArray(),buffer,bufferIndex,recordLineSize); bufferIndex += recordLineSize; if (bufferIndex >= bufferSize) { textWriter.Write(buffer); bufferIndex = 0; } } } if (bufferIndex > 0) textWriter.Write(buffer); } 有没有更好的方法来实现这一目标? 解决方法
我把一个简单的片段扔到一起,我认为它更清洁;但是,再一次,我不太确定你想要完成什么.另外,我没有任何课程,所以我不能做任何类型的测试.
这个样本与你的基本相同;除了它使用一些通用方法,它在一个地方完成所有写作. string filePath = "MickeyMouse.txt"; bool append = false; List<MyClassA> myClassAs = new List<MyClassA> { new MyClassA() }; List<char[]> outputLines = new List<char[]>(); foreach (MyClassA myClassA in myClassAs) { outputLines.Add(myIO.GetCharArray(myClassA)); if (myClassA.MyClassBs != null) outputLines.AddRange(myClassA.MyClassBs.Select(myClassB => myIO.GetCharArray(myClassB))); if (myClassA.MyClassCs != null) outputLines.AddRange(myClassA.MyClassCs.Select(myClassC => myIO.GetCharArray(myClassC))); } var lines = outputLines.Select(line => string.Concat<char>(line)); if (append) File.AppendAllLines(filePath,lines); else File.WriteAllLines(filePath,lines); 这是StringBuilder版本: string filePath = "MickeyMouse.txt"; bool append = false; List<MyClassA> myClassAs = new List<MyClassA> { new MyClassA() }; StringBuilder outputLines = new StringBuilder(); foreach (MyClassA myClassA in myClassAs) { outputLines.Append(myIO.GetCharArray(myClassA)); if (myClassA.MyClassBs != null) myClassA.MyClassBs.ForEach(myClassB=>outputLines.Append(myClassB)); if (myClassA.MyClassCs != null) myClassA.MyClassCs.ForEach(myClassC => outputLines.Append(myClassC)); } if (append) File.AppendAllText(filePath,outputLines.ToString()); else File.WriteAllText(filePath,outputLines.ToString()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |