如何在 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
扩展名(Select
、GroupBy
等)。您只需实施 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()
我有一个集合 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
扩展名(Select
、GroupBy
等)。您只需实施 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()