2013-12-11 62 views
4

如果我有一個項目在C#中的列表(例如List<string> items),我可以同時使用:.Count爲什麼沒有括號?

items.Count() 

items.Count 

獲得項目的總數。他們都有可用的理由嗎?爲什麼不只是有方法.Count()

我注意到,如果我過濾列表(以及,並用IEnumerable<string>結束):

items.Distinct().Count() 

然後.Count()必須被使用。那麼爲什麼List<string>完全允許.Count

回答

11

因爲在System.Linq.Enumerable上一個是(LINQ) extension method而另一個是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 '類。如果這個類實現了'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屬性那樣。

編輯顯然,Count()將調用Count如果它可用。

+1

如果底層類型有'Count'屬性,'Count()'的實現將會短路。 –

+1

計數來自'ICollection'而不是'List' – wudzik

+0

@wudzik哦對,抱歉,我會編輯我的評論,而我仍然可以。我很困惑,無論如何,我認爲標準數組應該在ICollection下被捕獲。 –