Лучший способ получить количество IEnumerable <T>

Какой лучший / самый простой способ получить количество элементов в коллекции IEnumerable без перечисления всех элементов в коллекции?

Возможно с LINQ или Lambda?

возможный дубликат Как: подсчитать элементы из IEnumerableбез повторения?

Chris Pietschmann 18.02.2012 19:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
30
1
49 962
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

В любом случае вам нужно пройти через это. Linq предлагает метод Count:

var result = myenum.Count();

Да, это работает, если у вас есть "using System.Linq;" в начале файла. Без Linq это не работает.

user1961169 21.11.2013 06:16

Невозможно с LINQ, поскольку вызов .Count (...) перечисляет коллекцию. Если вы столкнулись с проблемой, при которой невозможно выполнить итерацию по коллекции дважды, попробуйте следующее:

List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;

foreach (MyTableItem in myList)
{
   ...
}
Ответ принят как подходящий

Вам нужно будет перечислить, чтобы получить счет. Другие конструкции, такие как List, ведут текущий счет.

если в метод была передана переменная IEnumerable, то у меня работала variable.Count ().

Vikram Shetty 13.07.2015 18:46

@Vikram Насколько я знаю, это не может быть правдой. Вы уверены, что не ведете трансляцию?

Sinjai 20.07.2017 18:16

Для IEnumerableпеременная она должна быть переменной.

Sylwester Santorowski 28.01.2020 12:57

Также есть 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(), чтобы не перечислять всю коллекцию.

На мой взгляд, лучшее решение - это сделать следующее:

  1. using System.Linq.Dynamic;
  2. myEnumerable.AsQueryable (). Count ()

Неправильный. Это не лучше всего, а, наверное, и хуже.

SLaks 07.01.2011 01:24

По-прежнему то же самое ... что, если нам нужен только счетчик, и потому что мы не хотим повторяться для каждой записи ... Почему? потому что мы хотим побыстрее ..

nrs 26.03.2020 08:32

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

myEnumerable.Any () вместо myEnumerable.Count (), где первый даст первый элемент, а второй - все элементы.

Использовать это.

IEnumerable list =..........;

list.OfType<T>().Count()

он вернет счет.

Название list для IEnumerable, мягко говоря, сбивает с толку.

Theodor Zoulias 04.12.2020 07:37

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;

Другие вопросы по теме