2012-01-01 2 views
5

Спасибо за помощь в объяснении мне о IList и IEnumerable. Я отметил это как question. Теперь у меня есть запрос на получение немного дополнительной информации.Метод подсчета или свойство для IList

У меня есть такой код:

for (var index = 0; index < Model.Items.Count(); index++) 

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

for (var index = 0; index < Model.Items.Count; index++) 

Это похоже на работу.

Может кто-то, пожалуйста, подтвердите, что есть разница. Оба работают, поэтому я не уверен на 100%.

Будет ли самое эффективное? Требуется ли foreach IList или IEnumerable?

foreach(var item in Items) 
+0

Пожалуйста, поставьте ссылку на свой предыдущий вопрос –

+0

добавил, prervious Question – rene

ответ

4

Count() Вызов метода фактически вызывает статический метод Enumerable.Count(). Это оптимизировано для реализации IList, чтобы использовать это свойство, но для этого требуется проверка динамического типа и до сих пор попадает в свойство - поэтому использование свойства, безусловно, более эффективно. В .NET 3.5 он оптимизируется только для ICollection<T>, тогда как в .NET 4 он оптимизируется и для не общего ICollection. См. my Edulinq blog post on Count для более подробной информации.

Что касается последнего бита Вашего вопроса: а foreach петля может или не может быть более эффективным, но это было бы более читаемым на мой взгляд, что является гораздо более важным. Я бы определенно использовал foreach, если вам действительно не нужен индекс каждой записи.

+0

Спасибо Jon. Требуется ли foreach IList или IEnumerable? –

+0

@ Samantha2: на самом деле это не требуется, строго говоря, но 'IEnumerable' (или' IEnumerable ') достаточно, чтобы гарантировать, что вы можете использовать' foreach'. –

6

Count() метод расширение работает для всех объектов, которые поддерживают IEnumerable, и с тех пор IEnumerable сами по себе не имеют какие-либо средств отчетности количества элементов, то может иметь перебрать IEnumerable например, используя его IEnumerator, который может быть настоящим хитом производительности если вызывается много раз.

Однако, если вы смотрите в Count() реализации, вы увидите, что он оптимизирован для ICollection типов (как родовые и нетипичных, по крайней мере, в FW4.0, что означает IList и IList<T> также оптимизированы), и если ваш объект реализует ICollection (который сообщает количество элементов в Count), Count() метод возвращает количество элементов без итерации по коллекции. Вот почему вы не видите разницу в производительности. Тем не менее, если вы знаете, что у вас есть ICollection или IList экземпляр, почему бы не получить Count недвижимость напрямую и быть независимой от Count() метод реализации?

Кроме того, помните, что вы можете кэшировать возвращаемое значение из Count() метода в переменной, чтобы подавить несколько вызовов:

var count = Model.Items.Count(); 
for(var index = 0; index < count; index++) { } 
Смежные вопросы