Enumerable.Count() против свойства Count

Классы, реализующие System.Collection.ICollection, знают, сколько элементов в их последовательности. У них есть свойство Count, которое возвращает номер последовательности. Примерами являются Список, Словарь и Очередь.

Другие классы, реализующие IEnumerable, могут не реализовывать ICollection. У тебя нет счета собственности. Однако вы все равно можете узнать количество элементов в последовательности, перечислив все элементы и подсчитав их.

Мне последний способ кажется намного медленнее.

Единственное, что метод Enumerable.Count(this IEnumerable) знает о последовательности, это то, что он реализует IEnumerable. Он не знает, что у последовательности есть свойство, которое дает вам количество элементов.

Обычно это означает, что если вы используете Count() для списка, функция должна выполнять итерацию по всем элементам.

Однако реализация Enumerable.Count(IEnumerable) может проверять, реализует ли последовательность интерфейс ICollection, и если да, то может возвращать Count вместо его перечисления.

Вопрос: достаточно ли умен Enumerable.Count(этот IEnumerable), чтобы проверить, реализует ли последовательность ICollection, или он всегда выполняет итерацию по всем элементам?

В последнем случае было бы разумно расширить Enumerable функцией Count, которая проверяет, реализует ли объект ICollection, и если да, возвращает ICollection.Count()?


person Harald Coppoolse    schedule 14.10.2015    source источник


Ответы (1)


Как насчет просмотра исходного кода .

В строке 1905 вы можете увидеть метод подсчета со следующими строками:

ICollection<TSource> collectionoft = source as ICollection<TSource>;
if (collectionoft != null) return collectionoft.Count;
ICollection collection = source as ICollection;
if (collection != null) return collection.Count;

Как видите, метод использует свойство ICollection.Count, когда IEnumerable является ICollection.

Учтите, что следующий метод с подписью Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) не реализует это (из-за предоставленного вами пользовательского метода подсчета;))

ИЗМЕНИТЬ:

Следует также отметить, что методы LongCount не используют это свойство.

Из-за всего этого нет необходимости реализовывать собственный Count().

person Alex H    schedule 14.10.2015
comment
Я бы использовал Источник ссылок MS. - person Tim Schmelter; 14.10.2015
comment
@TimSchmelter О, спасибо ... Я даже не знал об этом сайте; D. Есть ли дополнительная причина не использовать github? - person Alex H; 14.10.2015
comment
Не то, что я знаю из. Но мне нравится сайт MS, вы можете легко искать методы или классы и смотреть, где есть ссылка на метод (нажмите на имя метода). Я также предпочитаю источники из первых рук. - person Tim Schmelter; 14.10.2015
comment
Существует также расширение VS, которое ведет непосредственно к ссылке источник метода, когда вы нажмете F12. - person Panagiotis Kanavos; 14.10.2015
comment
Не благодарите меня, благодарите @SLaks, который это написал - person Panagiotis Kanavos; 14.10.2015
comment
Танки Алексей и другие. Я не знал, что можно увидеть исходный код Linq. Учимся каждый день :-) - person Harald Coppoolse; 14.10.2015
comment
Панайотис: Я установил расширение, как вы сказали, но когда я нажимаю F11, Chrome открывает страницу referencesource .microsoft.com/System.Core/a.html всего с одним предложением: не используйте эту страницу напрямую, передайте #symbolId для перенаправления.. - person Harald Coppoolse; 14.10.2015