private void WriteRows()

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();
        }