в стеке отсутствуют смещения и отмены смещения в C # 2.0 - PullRequest
3 голосов
/ 11 мая 2009

Как ни странно, в коллекции стека, по-видимому, отсутствуют довольно простые методы shift и unshift *, и я работаю в 2.0, поэтому я не могу их просто расширить.

Есть ли какой-нибудь разумный метод или альтернативный класс коллекции, чтобы эти методы были доступны? Мне тоже нужно пуш и поп.

Редактировать: похоже, что коллекция, которую я хочу, действительно deque , которая, к счастью, не является родной для C #: (

В настоящее время я не могу использовать сторонние библиотеки, поэтому я буду использовать неуклюжий LinkedList (я говорю неуклюжий, потому что чтение и удаление - это две операции, где shift будет одна), но я думаю, что рекомендую подход PowerCollections любому, кто мог бы использовать это. Или еще лучше, переходя на методы расширения.

вздыхает


* Извинения, я не осознавал, что это необычные термины, я думал, что просто не знаю, где их найти в API. Для справки:

shift = удалить первый элемент

unshift = вставить элемент в начало коллекции

Ответы [ 7 ]

14 голосов
/ 11 мая 2009

Я бы сказал, используйте LinkedList<T>. У него есть методы для добавления и удаления спереди, а также для добавления и удаления сзади. Я никогда не слышал о сдвигах и отклонениях, но я предполагаю, что это означает.

9 голосов
/ 11 мая 2009

Никогда не слышал о сдвиге / снятии в стеке. Класс Stack обеспечивает Pop, Peek и Push.

6 голосов
/ 11 мая 2009

Вы используете неправильный класс, если вам нужен метод shift / unshift. stack - это структура данных «Последний пришел - первый вышел» (LIFO).

Если вы хотите сдвигать / снимать без всплывающих и нажимных клавиш, используйте Queue. Если вы хотите и то и другое, я рекомендую использовать Deque из библиотеки PowerCollections

1 голос
/ 23 сентября 2013

Это не совсем лучший вариант, но он близок к тому, чтобы быть массивом Javascript с shift / unshift и push / pop. Он не скрывает внутреннюю работу, и вы можете индексировать любой элемент, который вы хотите. У меня есть основные функции, хотя.

 public class JSList<T> : List<T>
{
    public JSList() : base() {}

    /// <summary>
    /// this the add item to the start of the list
    /// </summary>
    /// <param name="v"></param>
    public void Shift(T v)
    {
        this.Insert(0, v);
    }

    /// <summary>
    /// remove item at the start of the list
    /// </summary>
    /// <returns></returns>
    public T Unshift()
    {
        var toreturn = default(T);
        if (this.Count > 0)
        {
            toreturn = this[0];
            this.RemoveAt(0);
        }
        return toreturn;
    }

    /// <summary>
    /// Adds object to end of the list
    /// </summary>
    /// <param name="v"></param>
    public void Push(T v)
    {
        this.Add(v);
    }

    /// <summary>
    /// removes an item at the end of the list
    /// </summary>
    /// <returns></returns>
    public T Pop()
    {
        var toreturn = default(T);
        if (this.Count > 0)
        {
            toreturn = this[this.Count - 1];
            this.RemoveAt(this.Count - 1);
        }
        return toreturn;
    }

    public T Peek()
    {
        return this[this.Count - 1];
    }
}
1 голос
/ 11 мая 2009

По определению Класс * Stack представляет способ управления элементами в коллекции с использованием метода «Последний пришел - первым вышел» (LIFO) для добавления и удаления элементов. LIFO просто означает, что последний добавленный в коллекцию элемент будет автоматически удален первым.

Функциональность, которую вы хотите от нее, является чем-то особенным, но легко может быть достигнута следующим образом

public class MyStack<T>:Stack<T>{
  public void Shift(T item){
     // load stack into internal ordered list
     // clear stack content
     // insert into internal list at desired location
     // populate stack with content from internal list
  }
  public void Unshift(T item){
     // load stack into internal ordered list
     // clear stack content
     // insert into internal list at desired location
     // populate stack with content from internal list
  }
}

и, кажется, это все:)

1 голос
/ 11 мая 2009

Вы можете поддельные методы расширения , если вы используете C # 3.0 с таргетингом 2.0.

Можете ли вы описать, что такое операции сдвига / отмены сдвига?

0 голосов
/ 11 мая 2009
Shift ==> Stack.Pop
Unshift ==> Stack.Push

Unshift не возвращает количество элементов в стеке, для этого у вас есть свойство Stack.Count.

Также есть Stack.Peek, чтобы получить первый элемент, не удаляя его.

Стек класс

...