I threw together a simple snippet that I think is a bit cleaner; but, then again, I'm not quite sure what you are trying to accomplish. Also, I don't have any of your classes available, so I can't really do any kind of tests.
This sample does basically the same thing you have; except that it uses some generic methods, and it does all the writing in one spot.
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);
Here's the StringBuilder version:
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());