Я читал о методах отмены / повторения, я понимаю, как это должно быть реализовано (я нашел это интуитивно понятным).
Однако я думаю о коллекции, которую следует использовать как историю,
Многие люди используют стек, но стек C # реализован в виде массива, и это проблема:
Если я использую «ограниченную» историю (например, для 2000 команд), когда предел достигнут, у меня нет способа удалить элементы из конца стека, и если я найду способ сделать это, я необходимо переместить все элементы массива (и это при каждом выполнении команды).
LinkedList выглядит хорошо, но тратит много памяти.
Мой последний вариант - пользовательская реализация связанного списка, SingleLinkedList.
Узел этого списка состоит из свойства Value и свойства указателя NextNode, поэтому я использую двойную память для каждого элемента (но не более того, кроме случаев, когда я использую вещи меньше, чем "sizeof (void *)").
Я также храню указатель на первый элемент и указатель на последний элемент в коллекции.
Я могу легко добавить команды в историю и переместить их в повторную историю таким образом, однако я не могу создать «ограниченную» историю, потому что RemoveLast не разрешен (мне нужно пройти всю коллекцию, чтобы удалить последнюю пункт).
Итак, мой вопрос:
Должен ли я использовать LinkedList или мой собственный SingleLinkedList?
Обновление 1:
Спасибо за ответы на данный момент, в моей ситуации у меня нет проблем с памятью, ну, я не знаю, на кого я нацеливаюсь, я создаю служебную программу и по своему собственному представлению о "служебной программе ", они должны тратить как можно меньше ресурсов процессора / памяти (очевидно, не говорите мне" напишите это на c ++ так ", потому что есть большая разница).
На мой взгляд, односвязный список работает хорошо, я не очень люблю ограничивать историю, я думаю о Photoshop, где ваша история "безгранична".
Я боюсь только того, что может случиться, когда история отмен станет действительно большой, например, 8 часов использования.
Вот почему я думал об ограничении этого через LinkedList.
Как сказал кто-то другой, если я ограничу связанный список большим размером, около 60000 команд (я думаю, их должно быть достаточно), я трачу только небольшое количество памяти (4 байта * 60000) по сравнению с singlelinkedlist.
Тем не менее, я думаю, что я буду использовать LinkedList, однако просто чтобы быть уверенным, было бы хорошо, если бы я использовал историю без ограничений?
Обновление 2:
@ Akash Kava Ну, то, что вы говорите, важно, но вы неправильно поняли, ПОЧЕМУ я хочу использовать LinkedList и почему я не хочу использовать стек. Основная проблема со стеком состоит в том, что необходимо ограничить его размер, и при достижении этого предела нет быстрого способа удаления старых команд (это массив и удваивающий размер каждый раз, когда мы этого не хотим).
Один связанный список (подумайте о том, как он построен) быстр как стек (все операции со стеком O (1)) и не имеет ограничения. Однако в этом случае необходимо , чтобы не иметь ограничения, в противном случае у нас та же проблема, что и у стека, у нас нет быстрого способа удалить последний элемент нашего singlelinkedlist (который ведет себя как стек), потому что мы не знаем наш предыдущий элемент узла из последнего узла.
В этом случае довольно просто подумать о LinkedList, где у вас есть предыдущий указатель.
Однако мы используем 2 дополнительных указателя для каждого элемента нашего «стека» (который на этот раз создается через список ссылок), что похоже на использование в 3 раза больше памяти, чем необходимо для хранения команды (с массивом у нас нормальная память Использование: singlelinkedlist использует в 2 раза больше памяти, а связанный список использует в 3 раза больше памяти).
Итак, в основном я спрашивал, какая коллекция является «лучшей» для реализации стека для шаблона отмены-повтора.
Ваш ответ заставил меня подумать, что даже если я создаю команду 60000 в 1 программе, она составляет около 5 МБ памяти в программе, что не так уж и много.
В основном, если вы хотите ограничить историю отмен / повтороввам нужен LinkedList, иначе лучше использовать SingleLinkedList.