Удаление записи из Stack
У меня задание:
При нажатии на кнопку должна удаляться выбранная запись на dataGrid из коллекции. К примеру есть:
Stack<Doсument> doсument;
Класс документ имеет следующие поля:
string name; //название документа
DateTime data; //дата рассмотрения
string fio; //ФИО
Пробовала реализовать с помощью метода Pop(), однако это ж не то... и не знаю как при удалении обновить dataGrid.
Ответы (1 шт):
Про нецелесообразность использования стека для подобной задачи говорить не буду, ведь "задание есть задание", плюс вам уже написали в комментариях, что в реальном мире для подобных задач стоит использовать списки, к примеру.
Чтобы удалить элемент из стека с нужным индексом, можно путём недолгих размышлений прийти к следующему алгориму:
- Переместить все элементы перед нужным в дополнительный стек
- Удалите нужный элемент
- Переместить все элементы из дополнительного стека обратно
Я, уверен, что у вас получится самостоятельно это реализовать. После этого можете раскрыть спойлер и глянуть мой вариант кода.
Класс с расширением для стека:
public static class StackExtensions { public static T PopAtIndex<T>(this Stack<T> stack, int index) { if (index >= stack.Count) throw new ArgumentOutOfRangeException(nameof(index));
var auxiliaryStack = new Stack();
for (int i = 0; i < index; i++) auxiliaryStack.Push(stack.Pop()); // "перекидываем" элементы до нужного во вспомогательный стек
var poppedItem = stack.Pop(); // удаляем нужный элемент
for (int i = 0; i < index; i++) stack.Push(auxiliaryStack.Pop()); // "перекидываем" элементы обратно из вспомогательного стека
return poppedItem; // возвращаем удалённый элемент } }
Пример использования:
public static void Main()
{
var stack = new Stack<float>();
stack.Push(0f);
stack.Push(1f);
stack.Push(2f);
stack.Push(3f);
stack.Push(4f);
Console.WriteLine("Стек до: " + string.Join(", ", stack));
Console.WriteLine("Удалён: " + stack.PopAtIndex(2);
Console.WriteLine("Стек после: " + string.Join(", ", stack));
}
Вывод в консоль:
Стек до: 4, 3, 2, 1, 0
Удалён: 2
Стек после: 4, 3, 1, 0