Консольное меню на c#

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

static void Main(string[] args)
        {
            bool bTest = true;
            Console.CursorVisible = false;
            Console.WriteLine("Пункт 1");
            Console.WriteLine("Пункт 2");

            while (true)
            {
                ConsoleKeyInfo ck = Console.ReadKey();
                switch (ck.Key)
                {
                    case ConsoleKey.DownArrow:
                        Console.Clear();
                        Console.WriteLine("Пункт 1");
                        Console.WriteLine("Пункт 2");
                        break;
                    case ConsoleKey.UpArrow:
                        Console.Clear();
                        Console.WriteLine("Пункт 1");
                        Console.WriteLine("Пункт 2");
                        break;
                    case ConsoleKey.Enter:
                        if (bTest)
                        {
                            //Метод 1;
                        }
                        else
                        {
                            //Метод 2;
                        }
                        break;
                }
            }
        }

Мне нужно, чтобы я мог:

  1. Перемещаться по меню стрелочками (вроде как реализовано, только иногда приходится два раза нажимать на стрелочку).
  2. Чтобы выбранный пункт подсвечивался цветом.
  3. Нажатием enter этот пункт выполнялся (это вроде как реализовал, но почему-то он выполняет всегда только первый пункт и не очищает перед этим консоль).
  4. Была возможность вернуться в главное меню после выполненного одного из пунктов

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

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

Вот самый черновой пример. Если вы с ООП не знакомы, то хотя-бы методы то создавать, надеюсь умеете.

static void Main(string[] args)
{
    string[] menuItems = new string[] { "Пункт 1", "Пункт 2", "Выход" };

    Console.WriteLine("Меню");
    Console.WriteLine();

    int row = Console.CursorTop;
    int col = Console.CursorLeft;
    int index = 0;
    while (true)
    {
        DrawMenu(menuItems, row, col, index);
        switch (Console.ReadKey(true).Key)
        {
            case ConsoleKey.DownArrow:
                if (index < menuItems.Length - 1)
                    index++;
                break;
            case ConsoleKey.UpArrow:
                if (index > 0)
                    index--;
                break;
            case ConsoleKey.Enter:
                switch (index)
                {
                    case 2:
                        Console.WriteLine("Выбран выход из приложения");
                        return;
                    default:
                        Console.WriteLine($"Выбран пункт {menuItems[index]}");
                        break;
                }
                break;
        }
    }
}

private static void DrawMenu(string[] items, int row, int col, int index)
{
    Console.SetCursorPosition(col, row);
    for (int i = 0; i < items.Length; i++)
    {
        if (i == index)
        {
            Console.BackgroundColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Black;
        }
        Console.WriteLine(items[i]);
        Console.ResetColor();
    }
    Console.WriteLine();
}

Вывод в консоль

введите сюда описание изображения

→ Ссылка