如何在 VB.NET 集合 class 中实现 LINQ 函数

How to implement LINQ functions in a VB.NET collection class

我有一个集合 class,它是

的包装器
List(Of MyClass)

集合 class 实现了添加、计数等功能

Private lst As List(Of MyClass)

Public Function Count() As Long
    Return lst.Count
End Function

我想添加对集合 class 执行 Linq 查询的功能。所以客户可以这样做:

dim c as New MyCollectionClass
c.Add(New MyClass With {.Name = "XXX"})
c.Add(New MyClass With {.Name = "XXX"})
c.Add(New MyClass With {.Name = "YYYY"})

Dim nc As MyCollectionClass = c.GroupBy(function(x) x.Name)

如何实现 groupby 函数和所有其他 Linq 函数(select、filter、distinct、orderby 等)?我在 class.

中实现了 iQueryable

我对如何声明它及其参数和实现等感到困惑。我尝试了一些方法,例如

Public Function GroupBy(f As Func(Of MyClass)) As IEnumerable
    Return lst.GroupBy(Function(x As MyClass) f(x))
End Function

但这只是一个语法错误,我现在卡住了 :) 谢谢

FWIW 这是我为 Iqueryable 所做的:

Implements IEnumerable, IQueryable

Private lst As New List(Of MyClass)

Public ReadOnly Property Expression As Expression Implements IQueryable.Expression
    Get
        Return lst.AsQueryable.Expression
    End Get
End Property

Public ReadOnly Property ElementType As Type Implements IQueryable.ElementType
    Get
        Return lst.AsQueryable.ElementType
    End Get
End Property

Public ReadOnly Property Provider As IQueryProvider Implements IQueryable.Provider
    Get
        Return lst.AsQueryable.Provider
    End Get
End Property

您不需要 re-implement Linq 扩展名(SelectGroupBy 等)。您只需实施 IEnumerable(Of MyClass),然后标准 Linq 扩展将自动与您的 class 一起使用。

IEnumerable(Of ...) 实施示例:

Public Class MyCollection
    Implements IEnumerable(Of MyClass1)


    Private lst As New List(Of MyClass1)

    Public Function GetEnumerator() As IEnumerator(Of MyClass1) Implements IEnumerable(Of MyClass1).GetEnumerator
        Return lst.GetEnumerator()
    End Function

    Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
        Return DirectCast(lst, IEnumerable).GetEnumerator()
    End Function

End Class

和用法:

Dim collection = New MyCollection
...
Dim count = collection.Count()