Why List(Of T) doesn't have Count()?

前端 未结 4 2134
北荒
北荒 2021-02-15 22:11
Public Class MyList
    Inherits List(Of MyObject)

    Public ReadOnly Property SelectedCount() As Integer
        Get
            Return Me.Count(Function(obj) obj.IsS         


        
相关标签:
4条回答
  • 2021-02-15 22:33

    Use AsEnumerable for this purpose:

    Public ReadOnly Property SelectedCount() As Integer
        Get
            Return Me.AsEnumerable.Count(Function(obj) obj.IsSelected)
        End Get
    End Property
    
    0 讨论(0)
  • 2021-02-15 22:37
    1. You can cast Me to IEnumerable(Of MyObject):

      Return DirectCast(Me, IEnumerable(Of MyObject)).Count(Function(obj) obj.IsSelected)
      

      Or use Enumerable.Count() method directly:

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

      Extension Methods are transformed by compiler into direct static (shared in VB) methods calls, so there is no difference.

    2. Have no idea, really.

    3. Casting to underlying type does not change the object itself, so there is no performance penalty (unless boxing is involved, what is not a case here).

    4. C# does not allow properties with parameters and it requires properties to be called without (), so yes, it's better in situations like this one.

      In VB.NET both Me.Count() and Me.Count refer to Count property of List(Of T). In C# this.Count would refer to property and this.Count() would refer the extension method (because of parentheses).

    0 讨论(0)
  • 2021-02-15 22:48

    Call the method without the extension method syntax:

    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
    

    Make sure you have added an import to System.Linq.

    0 讨论(0)
  • 2021-02-15 22:52

    To answer #4, this works fine in C#:

    public class MyObject { public bool IsSelected { get { return true; } } }
    
    public class MyList : List<MyObject>
    {
        public int SelectedCount
        {
            get { return this.Count(x => x.IsSelected); }
        }
    }
    
    0 讨论(0)
提交回复
热议问题