Вставка значения в List<T>
выполняется медленнее, чем нажатие значения в Stack<T>
.
Да , по причинечто вставка в список - это операция, отличная от вставки в стек.Когда вы вставляете новый элемент в середину списка, весь последующий массив должен быть смещен на единицу.Это операция O (n).Перемещение в стек просто добавляет значение в конец внутреннего массива.Это дешево - O (1).Сопоставимая операция - List<T>.Add
Но я думаю, что здесь есть недоразумение относительно того, когда и когда использовать какой.Нет разницы между List<T>
и Stack<T>
в отношении реализации или производительности для одной и той же операции.Разница лишь в особенностях каждой коллекции.Вы можете имитировать всплывающее окно с Stack<T>
в List<T>
путем (добавления в конец списка и путем) удаления с конца: list.RemoveAt(list.Count - 1)
.Здесь важно то, как вы хотите его использовать.Если вы собираетесь использовать List<T>
в качестве Stack<T>
, откажитесь от первого и всегда используйте второе.Это проясняет ваши намерения.Таким образом, в будущем вы менее подвержены ошибкам.
Но для использования стека мне нужно его распаковать.
Здесь нет распаковки.Распаковка - это когда вы преобразуете из ссылочного типа (object
, IList<T>
) в тип значения (например, структуры, перечисления).Stack<T>
не тип значения, следовательно, нет распаковки.Это просто справочное преобразование, сохраняющее идентичность.Это так дешево, как только может.
Итак, вопрос в том, какой из них лучше, распаковать или использовать Insert
в List<T>
?Какой из них дороже?
Ваш второй код не работает.Stack<T>
не IList<T>
.Таким образом, у вас есть только один выбор.
Insert
определенно дороже, но это само по себе не означает, что вы должны использовать Stack<T>
.Stack<T>
не дает вам произвольный доступ через индексы, удаление из середины и т. Д. Но если вам нужен только Stack<T>
, придерживайтесь его.List<T>
- это слишком общая цель, с которой вы можете делать много вещей.
Итог: вы либо возвращаете Stack<T>
и используете его (лучшую производительность), либо возвращаете IList<T>
и использовать его (больше возможностей).В конце концов, решите, основываясь на использовании в первую очередь.