Как реализовать функции LINQ в классе коллекции VB.NET - PullRequest
1 голос
/ 09 июля 2019

У меня есть класс коллекции, который является оберткой для

List(Of MyClass)

И класс коллекции реализует такие вещи, как сложение, подсчет и т. Д.

Private lst As List(Of MyClass)

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

Я хочу добавить возможностьделать запросы 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, Different, orderby и т. Д.)?Я реализовал 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

1 Ответ

1 голос
/ 09 июля 2019

Вам не нужно повторно внедрять Linq расширения (Select, GroupBy и т. Д.). Вам просто нужно реализовать IEnumerable(Of MyClass), тогда стандартные расширения Linq будут работать с вашим классом автоматически.

Пример реализации 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()
...