Лучший способ получить количество IEnumerable <T> - PullRequest
27 голосов
/ 26 августа 2008

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

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

Ответы [ 10 ]

16 голосов
/ 26 августа 2008

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

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

14 голосов
/ 26 августа 2008

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

var result = myenum.Count();
12 голосов
/ 26 августа 2008

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

6 голосов
/ 03 января 2013

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

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

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

вернет счет.

1 голос
/ 25 ноября 2016

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

IEnumerable myStrings = new List () {"один", "два", "три"};

bool hasValues ​​= myStrings.Any ();

1 голос
/ 19 июля 2011

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

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

1 голос
/ 26 августа 2008

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

0 голосов
/ 20 декабря 2010

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

  1. с использованием System.Linq.Dynamic;
  2. myEnumerable.AsQueryable (). Count ()
0 голосов
/ 28 августа 2008

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

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

0 голосов
/ 26 августа 2008

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

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

foreach (MyTableItem in myList)
{
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...