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. 您可以投射MeIEnumerable(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