Как улучшить менюшку в консоли?

442
07 февраля 2017, 18:22
 class Program
{
    static void Main()
    {
        int i;
        try
        {
            do
            {
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.Write("1) Первый пункт\n2) Второй пункт\n3) Пока не доступно!\n\n");
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write("Выберите пункт: ");
                i = int.Parse(Console.ReadLine());
                Console.WriteLine();
                switch (i)
                {
                    case 1: Glas.Geto; break;
                    case 2: Glas.Viser(); break;
                    case 3: Console.WriteLine("0opps");  break;
                    default: Console.WriteLine("Вы что-то другое нажали..."); break;
                }
            }
            while (i != 3);
        }
        catch { }
    }
}

Подскажите можно ли как-то улучшить вывод?

Как-то не очень смотрится с Console.Write("1)\n 2\n")

Answer 1

Для такой простой программы я бы не стал заморачиваться и оставил всё как есть.

Если когда-нибудь вы захотите чего-то реально сложного, например, динамическую систему пунктов, конфигурируемость и ещё какие-нибудь какие-нибудь энтерпрайзные фичи, можно будет обобщить это, создав описатель меню:

class MenuItem
{
    public MenuItem(string name, Action actionOnCall)
    {
        Name = name;
        ActionOnCall = actionOnCall;
    }
    private readonly Action ActionOnCall;
    public string Name { get; }
    public Execute() => ActionOnCall();
}

Теперь ваше меню можно представить в таком виде:

IEnumerable<MenuItem> Items = new MenuItem[]
{
    new MenuItem("Первый пункт", Glas.Geto),
    new MenuItem("Второй пункт", Glas.Viser),
    new MenuItem("Пока не доступно!", () => Console.WriteLine("Oops"))
}

И код будет выглядеть так:

while (true)
{
    var items = Items.ToList(); // имеют право поменяться => фиксируем
    Console.ForegroundColor = ConsoleColor.DarkCyan;
    for (int idx = 0; idx < items.Length; idx++)
        Console.WriteLine($"{i}) {items[i].Name}");
    Console.WriteLine($"{items.Length}) Выход");
    Console.WriteLine();
    Console.ForegroundColor = ConsoleColor.Gray;
    Console.Write("Выберите пункт: ");
    int userInput;
    if (!int.TryParse(Console.ReadLine(), out userInput))
        userInput = -1;
    Console.WriteLine();
    if (0 <= userInput && userInput < items.Length)
       items[userInput].Execute();
    else if (userInput == items.Length)
        break;
    else
        Console.WriteLine("Вы что-то другое нажали...");
}

Я бы сказал, что стало намного сложнее, и так переписывать программу не стоит.

READ ALSO
Организация работы между БД и веб сервером

Организация работы между БД и веб сервером

Допустим, есть БД, заполненная большим количеством объектовИ на сервер можно послать GET запрос на получение всех этих объектов, пусть условно...

401
C#. Сохранение при запуске отладки

C#. Сохранение при запуске отладки

При изменении како-го либо компонента на форме, каких-то манипуляций, когда нажимаю F5 для запуска отладки переодически выходит окошко с предложением...

374
В чем отличие Web Site от Web Application?

В чем отличие Web Site от Web Application?

Я правильно понимаю, что проект сайта сейчас не актуален и лучше использовать Web App?

326