Списки: Count vs Count()

Учитывая список, какой метод является предпочтительным для определения количества элементов внутри?

var myList = new List<string>();

myList.Count
myList.Count()

Ответ 1

Count() - это метод расширения, введенный LINQ, а свойство Count является частью самого Списка (полученным из ICollection). Внутри LINQ проверяет, реализует ли IEnumerable ICollection ICollection, и если он использует это свойство Count. Поэтому в конце дня нет никакой разницы, какой вы используете для List.

Чтобы доказать свою точку зрения, здесь код из Reflector для Enumerable.Count()

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}

Ответ 2

Всегда предпочитайте свойства Count и Length для типа по методу расширения Count(). Первый является O (1) для каждого типа, который их содержит. У метода расширения Count() есть некоторые оптимизации проверки типов, которые могут заставить его работать также в O (1) раз, но будут деградировать до O (N), если базовая коллекция не является одним из немногих типов, о которых она знает.

Ответ 3

myList.Count - это метод в объекте list, он просто возвращает значение поля, так что очень быстро. Поскольку это небольшой метод, он, скорее всего, будет встроен компилятором (или временем выполнения), тогда они могут позволить другой оптимизации выполнить компилятор.

myList.Count() вызывает метод расширения (введенный LINQ), который перебирает все элементы в IEnumerabl, поэтому должен быть намного медленнее.

Однако (в реализации Microsoft) метод расширения Count имеет "специальный случай" для списков, который позволяет ему использовать свойство Count count, это означает, что метод Count() только немного медленнее, чем свойство Count.

Вряд ли вы сможете сказать разницу в скорости в большинстве приложений.

Итак, если вы знаете, что имеете дело со списком, используйте свойство Count, иначе, если у вас есть "неизвестный" IEnumerabl, используйте метод Count() и дайте ему оптимизировать для вас.

Ответ 4

Если вы случайно захотите изменить тип своей коллекции, вам лучше использовать расширение Count(). Таким образом, вам не нужно реорганизовывать свой код (например, использовать Length).