Как проверить, нет ли стека <T>

Есть ли другой способ, кроме Stack<T>.Count() == 0, чтобы проверить, является ли Stack<T> пустым?

Исходя из фона С++/Java, где классы "стека" обычно имеют какой-то выделенный "пустой" метод, например Java - Stack.empty.

Ответ 1

Вместо использования .Count() == 0 просто используйте .Count == 0. Это использует свойство стека, а не метод расширения linq.

Ответ 2

Вы также можете создать свой собственный метод расширения

namespace System.Collection.Generic {
   public static class SystemEx {
        public static bool IsEmpty<T>(this Stack<T> stack) {
            return (stack.Count==0);
        }    
   }

Ответ 3

Вы можете использовать stack.Any(). Быстрый, читаемый и стандартный способ для всех объектов IEnumerable<T>.

Ответ 4

Есть три общих подхода, и какой из них вы обычно используете, зависит от вкуса.

if(!stack.Any()) ...
if(stack.Count() == 0) ...
if(stack.Count == 0) ...

Профилирование разных подходов выглядит так:

Benchmark

.Any() и .Count() занимают в .Count() раз больше времени, чем .Count... и могут работать десятки тысяч раз в миллисекунду. Поэтому .Count > 0 "намного быстрее", но остальные все еще достаточно быстры, чтобы не беспокоиться о них в большинстве случаев. Я бы лично придерживался Any() так как чувствую, что он читается лучше, но я бы не стал никому отказываться от выбора Count.