我开始做以下事情:
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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。