2008-09-15 21 views
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 (फंक्शन (पी) p.sub_account_groups = sql_func (पी))" है यह त्रुटि ...

ऑपरेटर '=' प्रकारों के लिए परिभाषित नहीं किया गया है 'System.Collections.Generic.IList (st.data.AccountGroup)' और 'System.Collections.Generic.List (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; 
} 

जो पूरी तरह से संकलित से इस कोड से किसी भी तरह से अलग है ... मैं गलत तरीके से क्या कर रहा हूँ?

+0

"लैम्बाडा अभिव्यक्ति" - lol :) –

+0

यह वर्जित कोड है! –

+0

निषिद्ध कोड? मैंने सोचा कि रूबी था? – GEOCHET

उत्तर

0

मैंने सी # 3.0 पर जाने के बाद से VB.NET का उपयोग नहीं किया है, लेकिन ऐसा लगता है कि यह एक प्रकार की अनुमान समस्या हो सकती है। सूची आईलीस्ट लागू करने के बाद से थोड़ा अजीब है, इसलिए असाइनमेंट काम करना चाहिए। आप लैम्ब्डा के लिए "पी.आईडी = 123" कह सकते हैं और चीजें काम करने लगती हैं।

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 
0

मुझे लगता है कि ag.parent_id = 0 कहाँ ag.parent_id == 0 होना चाहिए:

किसी और को इस पर ध्यान देने में रुचि के लिए, यहाँ कोड है कि आप एक नया VB.NET कंसोल प्रोजेक्ट में पेस्ट इस मुद्दे प्रदर्शित करने के लिए कर सकते हैं?

+0

वीबी में नहीं ... = सही है। –

8

लैम्बडा के वीबी.Net में एक मूल्य वापस करना है, इसलिए आपके बराबर चिह्न ('=') को एक असाइनमेंट के बजाय तुलना के रूप में तुलना की जा रही है (ताकि लैम्ब्डा एक बूलियन लौटाए)।

+0

चेन सही है। आपका कोड सी # में ठीक काम करेगा। मैंने इसका परीक्षण करने के लिए एक समान उदाहरण बनाया। इसके अलावा आपके पास एकाधिक लाइनें नहीं हो सकती हैं, इसलिए आप रिटर्न भी नहीं जोड़ सकते हैं। तो आपको एक फॉरएच लूप का उपयोग करना होगा। –

8

आपके कोड के आधार पर यहां स्वीकृत उत्तर शायद गलत है। चेन ने सही सुराग दिया है: वीबी में लैम्बडास में हमेशा वापसी मूल्य होते हैं (सी # के विपरीत), बयान लैम्बडास अगले संस्करण में पेश किए जाते हैं।

इस बीच, आप बस इस कोड का उपयोग वीबी में नहीं कर सकते हैं। असाइनमेंट ऑपरेटर के लिए उप

parents.ForEach(Sub (p) p.sub_account_groups = sql_func(p)) 
+0

आपको एंडसब की आवश्यकता नहीं है? या उन्होंने इसे बीटा 1 में हटा दिया? –

+0

@ ऑक्सन: आपको उपरोक्त के रूप में एक-लाइनर के लिए इसकी आवश्यकता नहीं है। कम से कम, आप का उपयोग नहीं किया था। मैंने अभी तक बीटा का परीक्षण नहीं किया है: मैं ओएस एक्स का उपयोग कर रहा हूं। –

0

उपयोग::

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

(कल से एक बीटा के रूप में उपलब्ध) वीबी के अगले संस्करण के लिए निम्न कोड लिखे जाने की अनुमति होगी: बजाय एक नियमित रूप से पाश का प्रयोग करें

parents.ForEach(Sub(p) p.sub_account_groups = sql_func(p)) 
संबंधित मुद्दे