Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Вам нужно будет перечислить счетчик. Другие конструкции, такие как List, сохраняют счетчик.

Ответ 2

Решение зависит от того, почему вы не хотите перечислять через коллекцию.

Если это потому, что перечисление коллекции может быть медленным, тогда нет решения, которое будет быстрее. Возможно, вам захочется использовать 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.

Ответ 3

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

var result = myenum.Count();

Ответ 4

Используйте это.

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

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

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

Ответ 5

Там также IList или ICollection, если вы хотите использовать конструкцию, которая все еще несколько гибкая, но также имеет требуемую функцию. Оба они подразумевают IEnumerable.

Ответ 6

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

myEnumerable.Any() над myEnumerable.Count(), где первая будет давать первый элемент, а позже будет выдан все элементы.

Ответ 7

IEnumerable должен будет проходить через каждый элемент. чтобы получить полный счет. Если вам просто нужно проверить, есть ли один или несколько элементов в IEnumerable, более эффективным методом является проверка наличия каких-либо. Любой() проверяет только, есть ли значение и не проходит через все.

IEnumerable myStrings = new List() { "one", "two", "three" };

bool hasValues ​​= myStrings.Any();

Ответ 8

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

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

foreach (MyTableItem in myList)
{
   ...
}

Ответ 9

Если вам нужно подсчитать, а затем цикл, вам может быть лучше со списком.

Если вы используете count для проверки членов, вы можете использовать Any(), чтобы избежать перечисления всей коллекции.

Ответ 10

Лучшее решение - я думаю, это сделать следующее:

  • с использованием System.Linq.Dynamic;
  • myEnumerable.AsQueryable(). Count()