




В любом случае вам нужно пройти через это. Linq предлагает метод Count:
var result = myenum.Count();
Да, это работает, если у вас есть "using System.Linq;" в начале файла. Без Linq это не работает.
Невозможно с LINQ, поскольку вызов .Count (...) перечисляет коллекцию. Если вы столкнулись с проблемой, при которой невозможно выполнить итерацию по коллекции дважды, попробуйте следующее:
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
Вам нужно будет перечислить, чтобы получить счет. Другие конструкции, такие как List, ведут текущий счет.
если в метод была передана переменная IEnumerable, то у меня работала variable.Count ().
@Vikram Насколько я знаю, это не может быть правдой. Вы уверены, что не ведете трансляцию?
Для IEnumerable
Также есть IList или ICollection, если вы хотите использовать конструкцию, которая по-прежнему является несколько гибкой, но также имеет нужную вам функцию. Оба они подразумевают IEnumerable.
Решение зависит от того, почему вы не хотите проводить перечисление в коллекции.
Если это связано с тем, что перечисление коллекции может быть медленным, то более быстрого решения не существует. Возможно, вы захотите рассмотреть возможность использования 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.
Если вам нужно посчитать, а затем зациклить, вам может быть лучше со списком.
Если вы используете счетчик для проверки членов, вы можете использовать Any(), чтобы не перечислять всю коллекцию.
На мой взгляд, лучшее решение - это сделать следующее:
Неправильный. Это не лучше всего, а, наверное, и хуже.
По-прежнему то же самое ... что, если нам нужен только счетчик, и потому что мы не хотим повторяться для каждой записи ... Почему? потому что мы хотим побыстрее ..
Это также зависит от того, чего вы хотите достичь путем подсчета. Если вам интересно узнать, есть ли в перечисляемой коллекции какие-либо элементы, вы можете использовать
myEnumerable.Any () вместо myEnumerable.Count (), где первый даст первый элемент, а второй - все элементы.
Использовать это.
IEnumerable list =..........;
list.OfType<T>().Count()
он вернет счет.
Название list для IEnumerable, мягко говоря, сбивает с толку.
IEnumerable должен будет перебирать каждый элемент. чтобы получить полный счет. Если вам просто нужно проверить, есть ли в IEnumerable один или несколько элементов, более эффективным методом является проверка их наличия. Any () проверяет только наличие значения и не перебирает все в цикле.
IEnumerable myStrings = new List () {"один", "два", "три"};
bool hasValues = myStrings.Any ();
Когда я хочу использовать свойство Count, я использую ILIST, который реализует интерфейсы IEnumerable и ICollection. Структура данных ILIST - это массив. Я прошел через VS Debugger и обнаружил, что свойство .Count ниже возвращает свойство Array.Length.
IList<string> FileServerVideos = Directory.GetFiles(VIDEOSERVERPATH, "*.mp4");
if (FileServerVideos.Count == 0)
return;
возможный дубликат Как: подсчитать элементы из IEnumerableбез повторения?