2014-08-29 11 views
10

मैं निम्नलिखित त्रुटि मिलती से नहीं लगाया जा सकता, जब मैं अपने कोड को संकलित करने का प्रयास करें:SelectMany उपयोग

विधि 'System.Linq.Enumerable.SelectMany (System.Collections.Generic के लिए प्रकार तर्क। IENumerable, System.Func>) ' उपयोग से अनुमानित नहीं किया जा सकता है। प्रकार तर्क स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें।

 List<RowEntry> entries = ... 
     List<RowArgument> arguments = ... 

     var argumentsVal = entries.SelectMany((RowEntry entry) => 
      (IEnumerable<RowArgumentVal>)arguments.SelectMany((RowArgument arg) => 
      new RowArgumentVal() 
      { 
       Action = "X" 
       , EntryID = entry.ID 
       , ArgID = arg.ID 
       , Val_BIT = true 
       , Val_DATE = new DateTime(2014, 01, 04) 
       , Val_DATETIME = new DateTime(2014, 01, 04) 
       , Val_DECIMAL = 4.6M 
       , Val_INT = 88 
       , Val_TIME = new TimeSpan(6, 0, 0) 
      } 
     ).Cast<RowArgumentVal>()).Cast<RowArgumentVal>().ToList(); 

मैं कैसे मैं "प्रकार" इस ​​आगे भी ...

+1

'SelectMany' का उद्देश्य' रोवेन्ट्री 'उदाहरणों में बच्चों की इकाइयों की सूची प्राप्त करना है, जबकि आप ऐसा लगता है कि एक कार्टेशियन उत्पाद करने की कोशिश कर रहे हैं? –

+0

वास्तव में एक कार्टशियन उत्पाद। –

+2

आंतरिक 'SelectMany' को सरल' चुनें ' – Carsten

उत्तर

16

समस्या यह है की कोशिश चाहते हैं कर सकते हैं नहीं मिलता है कि आंतरिक SelectMany लागू नहीं है, और आप शायद Select का मतलब है।

var argumentsVal = entries.SelectMany(entry => 
    arguments.Select(arg => new RowArgumentVal())).ToList(); 

प्रत्येक entryarguments के अनुसार एक IEnumerable<RowArgumentVal> में मैप किया जाएगा।

कल्पना करें कि बाहरी SelectMany एक साधारण Select था, और यह List<IEnumerable<RowArgumentVal>> उत्पन्न करेगा। लेकिन क्योंकि यह SelectMany है, यह परिणाम को एक साधारण List<RowArgumentVal> में "फ़्लैट" कर देगा।

SelectMany विधि IEnumerable<T> पर मैपिंग की अपेक्षा करता है - T नहीं। आपका मूल कोड मान्य होगा यदि RowArgumentVal बस IEnumerable<T> इंटरफ़ेस को लागू करने के लिए हुआ, जो मुझे लगता है कि यह मामला नहीं है।

1

आप एक कार्तीय उत्पाद कर निम्नलिखित

var argumentsVal = from e in entries 
    from a in arguments 
    select new RowArgumentVal(...) 
2

यह दोनों सूचियों से एक कार्टशियन उत्पाद प्रतीत होता है क्योंकि उनके बीच कोई संबंध नहीं है। आप उनसे जुड़ना चाहते हैं लेकिन यह बिल्कुल स्पष्ट नहीं है कि कैसे।

यहाँ एक अधिक पठनीय और संकलन तरह से एक कार्तीय उत्पाद का उत्पादन होता है:

var query = from entry in entries 
      from argument in arguments 
      select new RowArgumentVal 
      { 
       Action = "X", EntryID = entry.ID, ArgID = argument.ID, // ... 
      }; 

List<RowArgumentVal> argumentsVal = query.ToList(); 
1

एक अलग रूप में, के रूप में "आगे टाइपिंग" आप सामान्य विधि कॉल करने के लिए प्रकार तर्क देना होगा से कर सकते थे । विशेष रूप से, अगर आप SelectMany<RowArgument, RowArgumentVal> से पीछे नहीं SelectMany बदल गया था आप परोक्ष System.Collections.Generic.IEnumerable<RowArgumentVal> के प्रकार RowArgumentVal कनवर्ट नहीं कर सकता त्रुटियों

मिला होता। एक स्पष्ट रूपांतरण मौजूद है (यदि आप एक डाली याद कर रहे हैं?)

प्रकार System.Func<RowArgument,int,System.Collections.Generic.IEnumerable<RowArgumentVal>> को सौंपने के लिए लैम्ब्डा अभिव्यक्ति कनवर्ट नहीं कर सकता क्योंकि ब्लॉक में प्रकार वापसी में से कुछ परोक्ष प्रतिनिधि वापसी प्रकार

के लिए परिवर्तनीय नहीं हैं जो होगा हो सकता है कि आपने यहां अन्य उत्तरों का नेतृत्व किया हो - कि आप एक ऐसी विधि को कॉल करने का प्रयास कर रहे थे जिसने अनुक्रम की उम्मीद की थी, लेकिन आप इसे एक ही वस्तु दे रहे थे।

(या यह तय करने की कोशिश में कि किस प्रकार के तर्क जोड़ने के लिए, आप महसूस करेंगे कि जल्द ही क्या गलत था।)

संबंधित मुद्दे