Учитывая список, какой метод является предпочтительным для определения количества элементов внутри?
var myList = new List<string>();
myList.Count
myList.Count()
Учитывая список, какой метод является предпочтительным для определения количества элементов внутри?
var myList = new List<string>();
myList.Count
myList.Count()
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;
}
Всегда предпочитайте свойства Count
и Length
для типа по методу расширения Count()
. Первый является O (1) для каждого типа, который их содержит. У метода расширения Count()
есть некоторые оптимизации проверки типов, которые могут заставить его работать также в O (1) раз, но будут деградировать до O (N), если базовая коллекция не является одним из немногих типов, о которых она знает.
myList.Count - это метод в объекте list, он просто возвращает значение поля, так что очень быстро. Поскольку это небольшой метод, он, скорее всего, будет встроен компилятором (или временем выполнения), тогда они могут позволить другой оптимизации выполнить компилятор.
myList.Count() вызывает метод расширения (введенный LINQ), который перебирает все элементы в IEnumerabl, поэтому должен быть намного медленнее.
Однако (в реализации Microsoft) метод расширения Count имеет "специальный случай" для списков, который позволяет ему использовать свойство Count count, это означает, что метод Count() только немного медленнее, чем свойство Count.
Вряд ли вы сможете сказать разницу в скорости в большинстве приложений.
Итак, если вы знаете, что имеете дело со списком, используйте свойство Count, иначе, если у вас есть "неизвестный" IEnumerabl, используйте метод Count() и дайте ему оптимизировать для вас.
Если вы случайно захотите изменить тип своей коллекции, вам лучше использовать расширение Count()
. Таким образом, вам не нужно реорганизовывать свой код (например, использовать Length
).