Третий вопрос, задание на собеседовании программера C# оказалось сложным для меня и в этот раз было такое:

Создать класс “ToDoListControl” с поддержкой действий undo (ctrl+z) и redo (ctrl+y).

				
					abstract class ToDoListControlBase
{
    protected readonly ToDoModel model = new ToDoModel();
    public abstract void AddItem(string value);
    public abstract void UpdateText(int id, string value);

    public abstract void Undo();
    public abstract void Redo();
}
class ToDoModel
{
    public ObservableCollection<ToDoItem> Items { get; } = new ObservableCollection<ToDoItem>();
    int id = 0;
    public int NewId()
    {
        return id++;
    }
}
class ToDoItem
{
    public int Id { get; }
    public string Value { get; set; }
    public ToDoItem(int id, string value)
    {
        Id = id;
        Value = value;
    }
}
				
			

Моё решение, которое я успел за пол часа получилось такое:

				
					class ToDoItemHistory : ToDoItem
{
    public int Comand;
    public bool isActual = true;
    public ToDoItemHistory(int c, int id, string value) : base(id, value)
    {
        Comand = c;
    }
}
class ToDoListControl : ToDoListControlBase
{
    List<ToDoItemHistory> _itemsHistory = new List<ToDoItemHistory>();
    ToDoModel _model = new ToDoModel();
    public override void AddItem(string value)
    {
        ToDoItem itm = new ToDoItem(_model.NewId(), value);
        _model.Items.Add(itm);
        ToDoItemHistory ih = new ToDoItemHistory(1/*add comand*/, itm.Id, itm.Value);
        _itemsHistory.Add(ih);
    }

    public override void Redo()
    {
        var ih = _itemsHistory.Last(i => i.isActual == false);

        if (ih.Comand == 1)
            _model.Items.Add(ih);
        else if (ih.Comand == 2)
            _model.Items.FirstOrDefault(i => i.Id == ih.Id).Value = ih.Value;

        ih.isActual = true;
    }

    public override void Undo()
    {
        var ih = _itemsHistory.Last(i => i.isActual == true);
        if (ih.Comand == 2)// change 
        {
            _model.Items.FirstOrDefault(i => i.Id == ih.Id).Value = ih.Value;
        }
        if (ih.Comand == 1) // add
        {
            _model.Items.Remove(_model.Items.FirstOrDefault(i => i.Id == ih.Id));
        }
        ih.isActual = false;
    }

    public override void UpdateText(int id, string value)
    {
        ToDoItemHistory itm = new ToDoItemHistory(2/*change comand*/, id, value);
        _itemsHistory.Add(itm);
            
        _model.Items.FirstOrDefault(i => i.Id == id).Value = value;
    }
}
				
			

Но поскольку меня не взяли на эту работу, похоже это решение не правильно, буду думать дальше, помогите. Возможно надо было использовать то, что ObservableCollection

Undo, Redo for ToDoList – вопросы с собеседования

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.