5

私には、私を完全に夢中にさせる何かがあります...

    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

parents.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)' に対して定義されていません。

しかし、Rob Connery のこのコードとどのように違うのか、私には本当にわかりません。

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; 
}

これは完全にコンパイルされます...私は間違って何をしていますか?

4

5 に答える 5

8

VB.Net のラムダは値を返す必要があるため、等号 ('=') は代入ではなく比較として解釈されます (ラムダがブール値を返すように)。

于 2009-05-21T13:00:06.853 に答える
8

あなたのコードに基づいて、ここで受け入れられた答えはおそらく間違っています。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))
于 2009-05-21T13:06:00.023 に答える
0

C#3.0に移行してからVB.NETを使用していませんが、型推論の問題である可能性があります。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
于 2008-09-16T02:09:44.750 に答える
0

代入演算子に Sub を使用します。

parents.ForEach(Sub(p) p.sub_account_groups = sql_func(p))
于 2010-05-23T17:58:59.487 に答える