Третий вопрос, задание на собеседовании программера 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 Items { get; } = new ObservableCollection();
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 _itemsHistory = new List();
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 – вопросы с собеседования