Как удалить элемент стека, который не находится на вершине стека в C # - PullRequest
31 голосов
/ 14 апреля 2009

К сожалению, предмет может быть удален только из стека "pop". В стеке нет метода «удалить» или чего-то подобного, но у меня есть стек (да, мне нужен стек!), Из которого мне нужно удалить некоторые элементы между ними.

Есть ли уловка, чтобы сделать это?

Ответы [ 12 ]

0 голосов
/ 06 марта 2018

Я сталкивался с этим вопросом. В своем коде я создал свой собственный метод расширения:

public static class StackExtensions
{
    public static void Remove<T>(this Stack<T> myStack, ICollection<T> elementsToRemove)
    {
        var reversedStack = new Stack<T>();

        while(myStack.Count > 0)
        {
            var topItem = myStack.Pop();
            if (!elementsToRemove.Contains(topItem))
            {
                reversedStack.Push(topItem);
            }
        }

        while(reversedStack.Count > 0)
        {
            myStack.Push(reversedStack.Pop());
        }           
    }
}

И я называю свой метод так:

var removedReportNumbers = 
selectedReportNumbersInSession.Except(selectedReportNumbersList).ToList();

selectedReportNumbersInSession.Remove(removedReportNumbers);
0 голосов
/ 14 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...