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

Различия между 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?

4b9b3361

Ответ 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)