2011-12-07 28 views
8

में लैम्ब्डा अभिव्यक्ति परिवर्तित सी # से:गहराई में एक अभिव्यक्ति पेड़

नहीं सभी लैम्ब्डा भाव अभिव्यक्ति के पेड़ में बदला जा सकता। आप एक लैम्बडा को कथन के ब्लॉक (यहां तक ​​कि केवल एक रिटर्न स्टेटमेंट) के साथ एक एक्सप्रेसन पेड़ में परिवर्तित नहीं कर सकते हैं -> इसे रूप में होना चाहिए जो केवल एक अभिव्यक्ति का मूल्यांकन करता है।

के बाद से Linq करने वाली वस्तु बयान अभिव्यक्ति पेड़ वस्तुओं में बदल नहीं है, लैम्ब्डा Linq करने वाली वस्तु ऑपरेटरों के साथ इस्तेमाल किया भाव बयान के एक ब्लॉक शामिल कर सकते हैं

 string[] count = { "one ", "two ", "three ", "four ", "five ", "six " }; 
     IEnumerable<int> result = count.Select(item => 
           { 
            Console.WriteLine(item); 
            return item.Length; 
           }); 
     foreach (int i in result); 

उत्पादन:

one two three four five six 

मैं अभी तक सीखने शुरू नहीं किया है LINQ करने के लिए-SQL या LINQ करने के लिए-संस्थाओं, लेकिन मैं LINQ बयान है कि IQueryable<T> पर काम के साथ प्रयोग किया ही कभी एक भी अभिव्यक्ति शामिल कर सकते हैं लैम्ब्डा भाव मान , पुनर्स्थापन के कारण कि केवल एक अभिव्यक्ति को अभिव्यक्ति वृक्ष में परिवर्तित किया जा सकता है?

आप

उत्तर

14

धन्यवाद यह सिर्फ यह है कि वे केवल एक ही अभिव्यक्ति शामिल कर सकते हैं नहीं है - यह है सब पर एक बयान लैम्ब्डा नहीं हो सकता। यहां तक ​​कि इस तरह एक ब्लॉक:

var result = query.Select(item => { return item.Length; }); 

एसक्यूएल करने के लिए LINQ के लिए अमान्य होगा। यह के रूप में व्यक्त करना होगा:।

var result = query.Select(item => item.Length); 

(मैं सिर्फ देखा है कि उस किताब आप उद्धृत की सा ओह अच्छा - यह बताती है मैं लगातार हूँ :)

ध्यान दें कि के रूप में .NET 4, अभिव्यक्ति पेड़ स्वयं में ब्लॉक होने की क्षमता है, लेकिन सी # कंपाइलर उस प्रकार के अभिव्यक्ति वृक्ष में कंबल लैम्बडा का अनुवाद नहीं कर सकता है। अन्य प्रतिबंध भी हैं, लेकिन वे शायद ही कभी समस्याएं पैदा करते हैं।

नहीं सभी अनाम प्रक्रियाएं अभिव्यक्ति के पेड़ के रूप में प्रतिनिधित्व किया जा सकता है:

यह खंड सी # 4 कल्पना की 4.6 में निर्दिष्ट है। उदाहरण के लिए, कथन निकायों और असाइनमेंट फ़ंक्शंस वाले अज्ञात फ़ंक्शंस वाले अज्ञात फ़ंक्शंस का प्रतिनिधित्व नहीं किया जा सकता है। इन मामलों में, एक रूपांतरण अभी भी मौजूद है, लेकिन संकलन समय पर असफल हो जाएगा।

+5

अब, पृथ्वी पर क्या होगा * आप ** सी # में गहराई ** में उल्लिखित कुछ के बारे में जानते हैं? ओह कोई बात नहीं। –

+0

आपको बहुत धन्यवाद – AspOnMyNet

+0

@ जोन: यह अचानक मेरे सामने हुआ कि http://stackoverflow.com/questions/8405423/do-at-compile-time-linq-to-objects- पर यह प्रश्न कितना संबंधित है। कथन-भी-अनुवाद-में-अभिव्यक्ति * विंक विंक * – AspOnMyNet

1

आप सही हैं, वे केवल एक अभिव्यक्ति कर सकते हैं।

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