为什么List(Of T)没有Count()?

dot*_*NET 8 .net linq vb.net extension-methods

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
Run Code Online (Sandbox Code Playgroud)

上面的代码导致编译时错误.如您所见,我正在尝试使用扩展方法Count(<predicate>).我猜错误是因为List类本身中也存在类似命名的属性Count ,隐藏了扩展成员.

我的问题是:

  1. 我是否需要将我的类显式地转换为其他内容才能访问Count扩展方法?如果是这样,在上述场景中究竟应该是哪个类?

  2. 为什么编译器不能从使用中推断出我所指的方法而不是属性?

  3. 考虑到这是一种使用频繁的方法(有时可能被称为每秒数百次),铸造是否会产生很大的开销?

  4. 在这方面C#是否比VB.NET更好?

如果有事可做,我正在使用带有VS2010的.NET 4.0.

编辑

错误信息:

' Public ReadOnly Property Count As Integer'没有参数,其返回类型无法编入索引.

Dan*_*Dan 6

不使用扩展方法语法调用方法:

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
Run Code Online (Sandbox Code Playgroud)

确保已向System.Linq添加导入.


Mar*_*zek 5

  1. 你可以投射MeIEnumerable(Of MyObject):

    Return DirectCast(Me, IEnumerable(Of MyObject)).Count(Function(obj) obj.IsSelected)
    
    Run Code Online (Sandbox Code Playgroud)

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

    Return Enumerable.Count(Me, Function(obj) obj.IsSelected)
    
    Run Code Online (Sandbox Code Playgroud)

    扩展方法由编译器转换为直接静态(shared在VB中)方法调用,因此没有区别.

  2. 真的,不知道.

  3. 转换为底层类型不会改变对象本身,因此不会有性能损失(除非boxing涉及,这里不是这种情况).

  4. C#不允许带参数的属性,它需要调用属性(),所以是的,在这种情况下更好.

    在VB.NET都Me.Count()Me.Count参考Count的财产List(Of T).在C#this.Count中将引用属性this.Count()并将引用扩展方法(因为括号).


Met*_*ght 5

为此目的使用AsEnumerable:

Public ReadOnly Property SelectedCount() As Integer
    Get
        Return Me.AsEnumerable.Count(Function(obj) obj.IsSelected)
    End Get
End Property
Run Code Online (Sandbox Code Playgroud)