Различия между Array.Length и Array.Count()
Возможный дубликат:
count vs length vs size в коллекции
Array.Length vs Array.Count
Я объявил этот массив:
int[] misInts = new Int[someNumber];
/* make some happy operations with the elements in misInts */
Поэтому я могу получить значение SomeNumber с:
misInts.Length или misInts.Count()
Массивы в С# наследуют от IEnumerable. Поэтому, если у меня есть:
Func<int> misIntsF = Enumerable.Range(0, someNumber).Select(c=> /* make some happy operations that return Integers */);
Мне сказали, что если я сделаю misIntsF.Count(), я действительно выполняю код в выражении Lambda, получаю результаты и подсчитываю их. Но массив misInts не имеет Lambda expressión.
Является ли misInts.Count() больше потребляемой памяти, чем misInts.Length? В чем отличия между misInts.Count() и misInts.Length?
Ответы
Ответ 1
array.Count()
на самом деле является вызовом метода расширения Enumerable.Count<T>(IEnumerable<T>)
.
Так как этот метод принимает IEnumerable<T>
(в отличие от ICollection<T>
, который имеет свойство Count
), ему нужно прорисовать всю последовательность, чтобы выяснить, насколько она велика.
Однако он действительно проверяет, реализует ли параметр ICollection<T>
(какие массивы делают), и, если это так, возвращает Count
напрямую.
Поэтому вызов .Count()
в массиве не намного медленнее, чем .Length
, хотя он будет включать дополнительный тип.
Ответ 2
Нет большой разницы, так как Enumerable.Count
выглядит первым, если он закрыт ICollection<T>
.
MSDN:
Если тип источника реализует ICollection, эта реализация используется для получения подсчета элементов. В противном случае этот метод определяет счетчик.
Источник:
ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null)
{
return collection.Count;
}
в противном случае он будет перечислять последовательность, чтобы подсчитать ее:
int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
}
}
return num;
(источник: ILSpy)