Удаление записи из Stack

У меня задание:

При нажатии на кнопку должна удаляться выбранная запись на dataGrid из коллекции. К примеру есть:

Stack<Doсument> doсument;

Класс документ имеет следующие поля:

string name;   //название документа
DateTime data; //дата рассмотрения
string fio;    //ФИО 
    

Пробовала реализовать с помощью метода Pop(), однако это ж не то... и не знаю как при удалении обновить dataGrid.


Ответы (1 шт):

Автор решения: iKuzmychov

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

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

  1. Переместить все элементы перед нужным в дополнительный стек
  2. Удалите нужный элемент
  3. Переместить все элементы из дополнительного стека обратно

Я, уверен, что у вас получится самостоятельно это реализовать. После этого можете раскрыть спойлер и глянуть мой вариант кода.

Класс с расширением для стека:


 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
→ Ссылка