Помощь в создании таблички

Нужно создать табличку вида, когда пользователь вводит размерность N и M, программа рисует табличку NxM, заполняем случайными числами(в разном диапазоне, поэтому нужно учитывать также ширину столбца, которая может быть произвольной).

Я попытался начать, но, конечно это совсем не то, что нужно и идей как это реализовать ну совсем нет, в интернете таких табличек даже близко не нашел, помогите как, с чего начать, хоть какую-то мысль чтобы я отталкивался, всё писать не прошу.

Все символы в коде закомментированы.

Вот какого она должна быть вида:

╔════╦════╗
║ x  ║ y  ║
╠════╬════╣
║ 1  ║ 1  ║
║ 2  ║ 2  ║
╚════╩════╝

Вот мой какой никакой код:

//╔  ╦  ═  ║  ╠  ╬  ╣  ╩  ╝ ╚
using System;

namespace Table
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Введите желаемое количество столбцов таблицы в ширину");
            uint width = uint.Parse(Console.ReadLine());
            Console.WriteLine("Введите желаемое количество столбцов таблицы в высоту");
            uint height = uint.Parse(Console.ReadLine());

            Console.Write("╔");

            for (int i = 0; i < width; i++)
            {
                Console.Write("═");
            }

            Console.Write("╦");

            for (int j = 0; j <height; j++)
            {
                Console.WriteLine("║");
                for (int i = 0; i <= width; i++)
                {
                    Console.Write(" ");
                }
                Console.WriteLine("║");
            }

            Console.Write("╚");

            for (int i = 0; i < width; i++)
            {
                Console.Write("═");
            }
            Console.WriteLine("╩");

        }
    }
}

Ответы (2 шт):

Автор решения: aepot

Не до конца понял, что вам нужно, при чем тут x и y и случайные числа, но подумал, что раз произвольный размер, значит речь просто про случайные числа.

static class Program
{
    const int maxWidth = 10;
    const int maxHeight = 10;
    const int maxNumber = 99;
    static int maxNumberLength = maxNumber.ToString().Length;

    static void Main(string[] args)
    {
        int width = ReadNumber("Введите ширину таблицы: ", x => x > 0 && x <= maxWidth, $"Введите число от 1 до {maxWidth}.");
        int height = ReadNumber("Введите высоту таблицы: ", x => x > 0 && x <= maxHeight, $"Введите число от 1 до {maxHeight}.");

        Random rnd = new Random();

        DrawSeparator(width, '╔', '╦', '╗' );
        for (int i = 0; i < height; i++)
        {
            if (i > 0)
                DrawSeparator(width, '╠', '╬', '╣');
            for (int j = 0; j < width; j++)
            {
                Console.Write('║');
                Console.Write(rnd.Next(maxNumber + 1).ToString().PadLeft(maxNumberLength));
            }
            Console.WriteLine('║');
        }
        DrawSeparator(width, '╚', '╩', '╝');

            
        Console.ReadKey();
    }

    static void DrawSeparator(int length, char left, char middle, char right)
    {
        Console.Write(left);
        Console.Write(string.Join(middle, Enumerable.Repeat(new string('═', maxNumberLength), length)));
        Console.WriteLine(right);
    }

    static int ReadNumber(string prompt, Predicate<int> condition, string errorMessage)
    {
        int result;
        while (true)
        {
            Console.Write(prompt);
            if (int.TryParse(Console.ReadLine(), out result) && condition(result))
                break;
            Console.WriteLine(errorMessage);
        }
        return result;
    }
}

Пример вывода в консоль

Введите ширину таблицы: 10
Введите высоту таблицы: 5
╔══╦══╦══╦══╦══╦══╦══╦══╦══╦══╗
║89║99║48║82║83║83║26║ 9║69║15║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║15║45║99║91║ 7║ 3║ 2║48║97║11║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║76║41║54║ 4║51║42║45║65║ 2║28║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║63║53║29║35║98║77║47║44║68║83║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║51║21║53║72║26║53║20║86║63║27║
╚══╩══╩══╩══╩══╩══╩══╩══╩══╩══╝

Чтобы расчитать ширину каждого столбца, нужно иметь все исходные данные в массиве чисел, далее преобразовать весь этот массив в массив строк. Далее создать массив длин ячеек, посчитанный как поиск максимальной длины ячейки для каждого столбца массива со строками. И просто затем использовать этот массив для паддингов.

.PadLeft(maxNumberLength) => .PadLeft(sizes[j])
new string('═', maxNumberLength) => new string('═', sizes[j])
→ Ссылка
Автор решения: Ilya Kvashnin

Я довел таблицу, до вида, который мне был нужен, поэтому прикрепляю немного измененный вариант таблицы @aepot, но именно этого я хотел добиться.

using System;
using System.Linq;

static class Program
{
    const int maxWidth = 10;
    const int maxHeight = 10;
    const int maxNumber = 99;
    static int maxLenghtOfWidth = maxNumber.ToString().Length;

    static void Main(string[] args)
    {
        int width = ReadNumber("Введите ширину таблицы: ", x => x > 0 && x <= maxWidth, $"Введите число в диапазон от 1 до {maxWidth}");
        int height = ReadNumber("Введите высоту таблицы: ", x => x > 0 && x <= maxHeight, $"Введите число в диапазон от 1 до {maxHeight}");

        Console.Clear();
        Random rnd = new Random();

        DrawSeparator(width, '╔', '╦', '╗');
        for (int i = 0; i < height; i++)
        {
            if (i == 1)
            {
                DrawSeparator(width, '╠', '╬', '╣');
            }
            for (int j = 0; j < width; j++)
            {
                Console.Write('║');
                if (i >= 0 && i < 1)
                {
                    Console.Write($"{j}".PadLeft(maxLenghtOfWidth));
                }
                else
                {
                    Console.Write(rnd.Next(maxNumber + 1).ToString().PadLeft(maxLenghtOfWidth));
                }
            }
            Console.WriteLine('║');
        }
        DrawSeparator(width, '╚', '╩', '╝');

        Console.ReadKey();
    }

    static void DrawSeparator (int lenght, char left, char middle,char right)
    {
        Console.Write(left);
        Console.Write(string.Join(middle, Enumerable.Repeat(new string('═', maxLenghtOfWidth), lenght)));
        Console.WriteLine(right);
    }

    static int ReadNumber(string text, Predicate<int> condition, string errorMessage)
    {
        int result;
        while (true)
        {
            Console.Write(text);
            if (int.TryParse(Console.ReadLine(), out result) && condition(result))
                break;
            Console.Clear();
            Console.WriteLine(errorMessage);
        }
        return result;
    }
}
→ Ссылка