Решение зависит от того, почему вы не хотите перечислять в коллекции.
Если перечисление коллекции может быть медленным, то нет более быстрого решения. Вы можете рассмотреть возможность использования ICollection вместо этого, если это возможно. Если перечисление не является удивительно медленным (например, он читает элементы с диска), скорость не должна быть проблемой.
Если для перечисления коллекции потребуется больше кода, он уже был написан для вас в виде метода расширения .Count (). Просто используйте MyEnumerable.Count ().
Если это потому, что вы хотите иметь возможность перечислять коллекцию после того, как вы посчитали, то метод расширения .Count () позволяет это сделать. Вы даже можете вызвать .Count () для коллекции, в которой вы находитесь, и она будет продолжаться с того места, где она была до подсчета. Например:
foreach (int item in Series.Generate(5))
{
Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}
даст результаты
0 (5)
1 (5)
2 (5)
3 (5)
4 (5)
Если это потому, что перечисление имеет побочные эффекты (например, запись на диск / консоль) или зависит от переменных, которые могут меняться между счетом и перечислением (например, чтение с диска) [N.B. Если возможно, я бы предложил переосмыслить архитектуру, так как это может вызвать много проблем], тогда одной из возможностей, которую следует рассмотреть, является чтение перечисления в прерывистое хранилище. Например:
List<int> seriesAsList = Series.Generate(5).ToList();
Все вышеперечисленное предполагает, что вы не можете изменить тип (т.е. он возвращается из библиотеки, которой вы не владеете). Если возможно, вы можете подумать о переходе на использование ICollection или IList (ICollection имеет более широкую область применения, чем IList), у которого есть свойство Count.