лямбда-выражения в vb.net - PullRequest
       15

лямбда-выражения в vb.net

5 голосов
/ 16 сентября 2008

У меня есть что-то, что сводит меня с ума ...

    Public Function GetAccountGroups() As IList(Of AccountGroup)
        Dim raw_account_groups As IList(Of AccountGroup)
        raw_account_groups = _repository.GetAccountGroups().ToList()
        Dim parents = (From ag In raw_account_groups _
                      Where ag.parent_id = 0 _
                      Select ag).ToList()

        parents(0).sub_account_groups = (From sag In raw_account_groups _
                               Where sag.parent_id = 0 _
                                Select sag).ToList()

        Dim sql_func As Func(Of AccountGroup, List(Of AccountGroup)) = Function(p) _
                                                                      (From sag In raw_account_groups _
                                                                       Where sag.parent_id = p.id _
                                                                       Select sag).ToList()

        parents.ForEach(Function(p) p.sub_account_groups = sql_func(p))

        Return parents
    End Function

В строке "parent.ForEach (Function (p) p.sub_account_groups = sql_func (p))" есть эта ошибка ...

Оператор '=' не определен для типов 'System.Collections.Generic.IList (Of st.data.AccountGroup)' и 'System.Collections.Generic.List (Of st.data.AccountGroup)'.

но я действительно не вижу, чем он отличается от этого кода от Роба Коннери

public IList<Category> GetCategories() {
IList<Category> rawCategories = _repository.GetCategories().ToList(); var parents = (from c in rawCategories 
where c.ParentID == 0
select c).ToList();
 parents.ForEach(p =>
{
p.SubCategories = (from subs in rawCategories
where subs.ParentID == p.ID
select subs).ToList();
});

return parents; 
}

который отлично компилируется ... что я делаю неправильно?

Ответы [ 5 ]

8 голосов
/ 21 мая 2009

Принятый ответ, вероятно, неверный, в зависимости от вашего кода. chyne дал правильную подсказку: лямбды в VB всегда имеют возвращаемые значения (в отличие от C #), однако лямбды-выражения введены в следующей версии.

А пока вы просто не можете использовать этот код в VB. Вместо этого используйте обычный цикл:

For Each p In parents
    p.sub_account_groups = sql_func(p)
Next

Следующая версия VB (доступна как бета-версия со вчерашнего дня) позволит писать следующий код:

parents.ForEach(Sub (p) p.sub_account_groups = sql_func(p))
8 голосов
/ 21 мая 2009

Лямбда в VB.Net должна возвращать значение, поэтому ваш знак равенства ('=') интерпретируется как сравнение (так что лямбда возвращает логическое значение), а не как присваивание.

0 голосов
/ 23 мая 2010

Используйте Sub для оператора присваивания:

parents.ForEach(Sub(p) p.sub_account_groups = sql_func(p))
0 голосов
/ 21 мая 2009

Я думаю ag.parent_id = 0 должно быть Где ag.parent_id == 0?

0 голосов
/ 16 сентября 2008

Я не использовал VB.NET с момента перехода на C # 3.0, но, похоже, это может быть проблема вывода типа. Ошибка немного странная, поскольку List реализует IList, поэтому назначение должно работать. Вы можете сказать «p.ID = 123» для лямбды, и все, кажется, работает.

Для всех, кто заинтересован в этом, вот код, который вы можете вставить в новый консольный проект VB.NET, чтобы продемонстрировать эту проблему:

Module Module1
    Sub Main()
    End Sub
End Module

Class AccountGroup
    Public parent_id As Integer
    Public id As Integer
    Public sub_account_groups As List(Of AccountGroup)
End Class
Class AccountRepository
    Private _repository As AccountRepository

    Public Function GetAccountGroups() As IList(Of AccountGroup)
        Dim raw_account_groups As IList(Of AccountGroup)
        raw_account_groups = _repository.GetAccountGroups().ToList()
        Dim parents = (From ag In raw_account_groups _
                       Where ag.parent_id = 0 _
                       Select ag).ToList()
        parents(0).sub_account_groups = (From sag In raw_account_groups _
                                         Where sag.parent_id = 0 _
                                         Select sag).ToList()

        Dim sql_func As Func(Of AccountGroup, List(Of AccountGroup)) = Function(p) _
                                                                            (From sag In raw_account_groups _
                                                                             Where sag.parent_id = p.id _
                                                                             Select sag).ToList()



        parents.ForEach(Function(p) p.sub_account_groups = sql_func(p))
        Return parents
    End Function
 End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...