Покритикуйте код: консольная менюшка - C#

Узнай цену своей работы

Формулировка задачи:

простая консольная менюшка, пригодится для, скажем, объединения разных лабораторных работ в один файл (чтоб была возможность выбора). делал максимально просто для использования. прошу указать на ошибки в реализации.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication17
{
  class MenuItem
  {
    public string Text { get; set; }
    public Action Action { get; set; }
 
    public MenuItem(string text, Action action)
    {
      Text = text;
      Action = action;
    }
 
    public MenuItem()
    {
    }
 
    public override string ToString()
    {
      return Text;
    }
  }
 
  class Menu
  {
    private List<MenuItem> _items;
    private int _cur;
    private const char Arrow = (char)16;
    private ConsoleColor _lastBackgroundColor;
    private ConsoleColor _lastForegroundColor;
 
    private void ChangeColor(ConsoleColor background, ConsoleColor foreground)
    {
      _lastBackgroundColor = Console.BackgroundColor;
      _lastForegroundColor = Console.ForegroundColor;
      Console.BackgroundColor = background;
      Console.ForegroundColor = foreground;
    }
 
    private void RestoreColor()
    {
      Console.BackgroundColor = _lastBackgroundColor;
      Console.ForegroundColor = _lastForegroundColor;
    }
 
    public int CurrentPosition
    {
      get
      {
        return _cur;
      }
    }
 
    public void Draw()
    {
      Console.Clear();
 
      for (var i = 0; i < _items.Count; i++)
        if (_cur == i)
        {
          Console.Write(" {0} ", Arrow);
          ChangeColor(ConsoleColor.Gray, ConsoleColor.Black);
          Console.WriteLine("{0}", _items[i]);
          RestoreColor();
        }
        else
          Console.Write("   {0}\n", _items[i]);
    }
 
    public void Start()
    {
      while (true)
      {
        var keyInfo = Console.ReadKey(true);
        switch (keyInfo.Key)
        {
          case ConsoleKey.UpArrow:
            if (_cur == 0)
              break;
 
            _cur--;
            Draw();
            break;
 
          case ConsoleKey.DownArrow:
            if (_cur == _items.Count - 1)
              break;
 
            _cur++;
            Draw();
            break;
 
          case ConsoleKey.Enter:
            Console.Clear();
            _items[_cur].Action();
            return;
        }
      }
    }
 
    public void AddItem(MenuItem i)
    {
      _items.Add(i);
    }
 
    public void RemoveItem(MenuItem i)
    {
      _items.Remove(i);
    }
 
    public Menu()
    {
      _items = new List<MenuItem>();
      _cur = 0;
      Draw();
    }
  }
 
  class Program
  {
    static void Main(string[] args)
    {
      var menu = new Menu();
 
      menu.AddItem(new MenuItem
      {
        Action = () => Console.WriteLine("Hello 1"),
        Text = "Test item 1"
      });
 
      menu.AddItem(new MenuItem
      {
        Action = () => Console.WriteLine("Hello 2"),
        Text = "Test item 2"
      });
 
      menu.AddItem(new MenuItem
      {
        Action = () => Console.WriteLine("Hello 3"),
        Text = "Test item 3"
      });
 
      menu.Start();
      Console.ReadKey();
    }
  }
}

Решение задачи: «Покритикуйте код: консольная менюшка»

textual
Листинг программы
public void Redraw()
{
    Console.Clear();
 
    for (var i = 0; i < _items.Count; i++)
        DrawMenuItem(i);
    DrawSelectedMenuItem();
}
 
private void DrawMenuItem(int index)
{
    Console.SetCursorPosition(0, index);
    Console.Write("   {0}\n", _items[index]);
}
 
private void DrawSelectedMenuItem()
{
    if (_items.Count == 0) return;
 
    int cursorTop = Console.CursorTop;
    Console.SetCursorPosition(0, _cur);
    Console.Write(" {0} ", Arrow);
    ChangeColor(ConsoleColor.Gray, ConsoleColor.Black);
    Console.WriteLine("{0}", _items[_cur]);
    RestoreColor();
    Console.CursorTop = cursorTop;
}
 
public void Start()
{
    Redraw();
    Console.CursorVisible = false;
 
    while (true)
    {
        var keyInfo = Console.ReadKey(true);
        switch (keyInfo.Key)
        {
            case ConsoleKey.UpArrow:
                if (_cur == 0)
                    break;
 
                DrawMenuItem(_cur--);
                DrawSelectedMenuItem();
                break;
 
            case ConsoleKey.DownArrow:
                if (_cur == _items.Count - 1)
                    break;
 
                DrawMenuItem(_cur++);
                DrawSelectedMenuItem();
                break;
 
            case ConsoleKey.Enter:
                Console.Clear();
                Console.CursorVisible = true;
                _items[_cur].Action();
                return;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы