Какой лучший/самый простой способ получить количество элементов в коллекции IEnumerable без перечисления всех элементов в коллекции?
Возможно с LINQ или Lambda?
Какой лучший/самый простой способ получить количество элементов в коллекции IEnumerable без перечисления всех элементов в коллекции?
Возможно с LINQ или Lambda?
Вам нужно будет перечислить счетчик. Другие конструкции, такие как List, сохраняют счетчик.
Решение зависит от того, почему вы не хотите перечислять через коллекцию.
Если это потому, что перечисление коллекции может быть медленным, тогда нет решения, которое будет быстрее. Возможно, вам захочется использовать 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.
В любом случае вам нужно пройти через него. Linq предлагает метод Count
:
var result = myenum.Count();
Используйте это.
IEnumerable list =..........;
list.OfType<T>().Count()
он вернет счет.
Там также IList или ICollection, если вы хотите использовать конструкцию, которая все еще несколько гибкая, но также имеет требуемую функцию. Оба они подразумевают IEnumerable.
Это также зависит от того, чего вы хотите достичь, посчитав.. Если вам интересно узнать, есть ли в перечислимой коллекции какие-либо элементы, вы можете использовать
myEnumerable.Any() над myEnumerable.Count(), где первая будет давать первый элемент, а позже будет выдан все элементы.
IEnumerable должен будет проходить через каждый элемент. чтобы получить полный счет. Если вам просто нужно проверить, есть ли один или несколько элементов в IEnumerable, более эффективным методом является проверка наличия каких-либо. Любой() проверяет только, есть ли значение и не проходит через все.
IEnumerable myStrings = new List() { "one", "two", "three" };
bool hasValues = myStrings.Any();
Невозможно с LINQ, поскольку вызов .Count(...) перечисляет коллекцию. Если вы столкнулись с проблемой, когда вы не можете перебирать коллекцию дважды, попробуйте следующее:
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
Если вам нужно подсчитать, а затем цикл, вам может быть лучше со списком.
Если вы используете count для проверки членов, вы можете использовать Any()
, чтобы избежать перечисления всей коллекции.
Лучшее решение - я думаю, это сделать следующее: