Dot-Net

為什麼 List(Of T) 沒有 Count()?

  • September 11, 2013
Public Class MyList
   Inherits List(Of MyObject)

   Public ReadOnly Property SelectedCount() As Integer
       Get
           Return Me.Count(Function(obj) obj.IsSelected)
       End Get
   End Property
End Class

上面的程式碼會導致編譯時錯誤。如您所見,我正在嘗試使用擴展方法Count(<predicate>)。我猜這個錯誤是因為List類本身也有一個類似名稱的屬性 Count,隱藏了擴展成員。

我的問題是:

  1. 我是否需要將我的類顯式轉換為其他東西才能訪問Count擴展方法?如果是這樣,在上面的場景中它到底應該是哪個類?
  2. 為什麼編譯器不能從我指的是方法而不是屬性的用法中推斷出來?
  3. 考慮到這是一種大量使用的方法(有時可能每秒呼叫數百次),強制轉換是否涉及大量成本?
  4. 在這方面,C# 是否比 VB.NET 更好?

我正在使用 .NET 4.0 和 VS2010,如果這有關係的話。

編輯

錯誤資訊:

’ Public ReadOnly Property Count As Integer’ 沒有參數並且它的返回類型不能被索引。

呼叫沒有擴展方法語法的方法:

Public Class MyList
   Inherits List(Of MyObject)

   Public ReadOnly Property SelectedCount() As Integer
       Get
           Return Enumerable.Count(Me, Function(obj) obj.IsSelected)
       End Get
   End Property
End Class

確保您已將導入添加到 System.Linq。

  1. 您可以投射Me到IEnumerable(Of MyObject):
Return DirectCast(Me, IEnumerable(Of MyObject)).Count(Function(obj) obj.IsSelected)

或者Enumerable.Count()直接使用方法:

Return Enumerable.Count(Me, Function(obj) obj.IsSelected)

擴展方法由編譯器轉換為直接靜態(shared在 VB 中)方法呼叫,因此沒有區別。 2. 不知道,真的。 3. 轉換為基礎類型不會改變對象本身,因此沒有性能損失(除非boxing涉及到,這裡不是這種情況)。 4. C# 不允許帶有參數的屬性,它需要在沒有 的情況下呼叫屬性(),所以是的,在這種情況下會更好。

在 VB.NET 中Me.Count(),Me.Count請參閱 ) 的Count屬性List(Of T。在 C#this.Count中將引用屬性並this.Count()引用擴展方法(因為括號)。

引用自:https://stackoverflow.com/questions/18743457