in System.Reflection.Metadata/MdDumper/Visualization/MetadataVisualizer.cs [120:185]
private void WriteRows(string title)
{
Debug.Assert(pendingRows.Count > 0);
if (pendingRows.Count == 1)
{
pendingRows.Clear();
return;
}
writer.Write(title);
writer.WriteLine();
string columnSeparator = " ";
int rowNumberWidth = pendingRows.Count.ToString("x").Length;
int[] columnWidths = new int[pendingRows.First().Length];
foreach (var row in pendingRows)
{
for (int c = 0; c < row.Length; c++)
{
columnWidths[c] = Math.Max(columnWidths[c], row[c].Length + columnSeparator.Length);
}
}
int tableWidth = columnWidths.Sum() + columnWidths.Length;
string horizontalSeparator = new string('=', tableWidth);
for (int r = 0; r < pendingRows.Count; r++)
{
var row = pendingRows[r];
// header
if (r == 0)
{
writer.WriteLine(horizontalSeparator);
writer.Write(new string(' ', rowNumberWidth + 2));
}
else
{
string rowNumber = r.ToString("x");
writer.Write(new string(' ', rowNumberWidth - rowNumber.Length));
writer.Write(rowNumber);
writer.Write(": ");
}
for (int c = 0; c < row.Length; c++)
{
var field = row[c];
writer.Write(field);
writer.Write(new string(' ', columnWidths[c] - field.Length));
}
writer.WriteLine();
// header
if (r == 0)
{
writer.WriteLine(horizontalSeparator);
}
}
writer.WriteLine();
pendingRows.Clear();
}