Если я хочу изменить верхнюю часть Stack, как мне это сделать?
Я знаю, что вы можете использовать Stack.Pop(), а затем вернуть измененное значение, но это кажется неэлегантным.
Есть ли другой способ?
Пример:
Stack<string> stringStack;
stringStack.Push("foo");
stringStack.Push("ba");
stringStack.Replace("bar"); //implementation
Кажется, на него есть действительно очевидный ответ. Не знаю, почему это еще не реализовано.
Вы не сможете избежать поп и пуш, это просто то, как стеки реализованы в .net. Хорошей новостью является то, что обе операции имеют значение O(1), если они не нарушают пропускную способность. Честно говоря, если вам нужно внести много мутаций в элементы вашей коллекции, массив или List<T> подходят гораздо лучше, так как это будет одна операция O (1) против 2 для всплывающего окна стека.
Просто упомянем: как было предложено в этом ответе (относительно Queue), можно изменить верхний элемент, когда у вас есть стек ссылочных типов.





Вы можете создать такой метод расширения;
public static class StackExtensions
{
public static void Replace<T>(this Stack<T> stack, T item)
{
stack.Pop();
stack.Push(item);
}
}
И вы можете использовать это так;
var stringStack = new Stack<string>();
stringStack.Push("foo");
stringStack.Push("ba");
stringStack.Replace("bar");
foreach (var item in stringStack)
{
Console.WriteLine(item);
}
Что даст вам этот вывод;
bar
foo
Вы можете создать метод расширения для стека. В этом методе просто нажмите и снова нажмите новое значение.