2013-12-11 4 views
4

Если у меня есть список элементов (например List<string> items) в C#, я могу использовать как:Зачем стоит работать без круглых скобок?

items.Count() 

и

items.Count 

, чтобы получить общее количество элементов. Есть ли причина, по которой они оба доступны? Почему бы просто не использовать метод .Count()?

Я заметил, что если я отфильтровать список (и, и в конечном итоге с IEnumerable<string>):

items.Distinct().Count() 

затем .Count() должен быть использован. Так почему же List<string> разрешить .Count?

ответ

11

Поскольку один является (LINQ) extension method по адресу System.Linq.Enumerable, а другой является property on the class.

+1

Это не свойство класса, это свойство интерфейса 'ICollection', посмотрите здесь http://msdn.microsoft.com/pl-pl/library/92t2ye13(v=vs.110).aspx – wudzik

+3

@wudzik how это не свойство класса, если оно определено в интерфейсе :) Интерфейс - это подпись, а не реализация. Следовательно, это свойство класса, которое, как только это происходит, должно выполняться интерфейсом. – Alex

+0

Свойство 'Count' в классе' List 'принадлежит' List 'class. Не имеет значения, реализует ли этот класс 'ICollection ' интерфейс, свойство все еще принадлежит классу. Интерфейс определяет контракт, позвольте мне указать на эти слова: «Если вы (класс) хотите быть помечены как моя (интерфейсная) реализация, у вас должны быть эти требования.» ', Требования (в этом случае свойство Count) принадлежат классу. (Я использую 'List ' и 'ICollection ' как пример, но эта концепция работает для любого случая класса, который реализует интерфейс.) –

1

Потому что это Count Недвижимость List<T> класс. И таким образом List<T> - IEnumerable<T> у вас есть Count() расширение также доступно.

BTW Count() расширения будет просто возвращать значение Count свойства, если перечислим источник реализует ICollection интерфейса (где объявленные это свойство):

ICollection is3 = source as ICollection; 
if (is3 != null) 
    return is3.Count; 
1

Свойство Count не является расширение, а свойство ICollection<T> и, следовательно, List<T>.

Функция Count() является расширением LINQ. Он работает, фактически подсчитывая количество элементов в коллекции, вместо того, чтобы просто хранить счет в поле, например, свойство Count.

EDIT И, по-видимому, Count() позвонит по номеру Count, если он доступен.

+1

Реализация 'Count()' будет короткозамкнута на свойстве 'Count', если у него есть базовый тип. –

+1

Граф из 'ICollection' не' List' – wudzik

+0

@wudzik О, извиняюсь, я отредактирую свой комментарий, пока я еще могу. Я был в замешательстве, стандартные массивы должны быть пойманы под «ICollection» в любом случае, я думаю. –

Смежные вопросы