क्या C # लैंबडा अभिव्यक्ति में एक से अधिक कथन हो सकते हैं?


131

क्या C # लैंबडा अभिव्यक्ति में एक से अधिक कथन शामिल हो सकते हैं?

(संपादित करें: जैसा कि नीचे दिए गए कई उत्तरों में संदर्भित है, यह प्रश्न मूल रूप से "बयानों" के बजाय "लाइनों" के बारे में पूछा गया है।)


17
हां, आप कई लाइनों का उपयोग कर सकते हैं। मैं इसे पूर्ण उत्तर देना सही नहीं समझता।
टेसेरेक्स

1
@Tesserex - क्या यह एक जवाब नहीं है ... तुम सही हो!
RQDQ

3
@RQDQ क्योंकि यह एक हाँ या कोई सवाल नहीं है, मुझे नहीं लगता कि यह प्रतिनिधि के योग्य है जो इसे अपवोट से उत्पन्न करेगा।
टेसेरेक्स

जवाबों:


195

ज़रूर:

List<String> items = new List<string>();

var results = items.Where(i => 
            {
                bool result;

                if (i == "THIS")
                    result = true;
                else if (i == "THAT")
                    result = true;
                else
                    result = false;

                return result;
            }
        );

31

(मैं मान रहा हूं कि आप वास्तव में कई लाइनों के बजाय कई बयानों के बारे में बात कर रहे हैं।)

आप लैंबडा एक्सप्रेशन में ब्रेसेस का उपयोग करके कई स्टेटमेंट का उपयोग कर सकते हैं, लेकिन केवल सिंटैक्स जो ब्रेसिज़ का उपयोग नहीं करता है, उसे एक्सप्रेशन में बदला जा सकता है:

// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };        
Expression<Func<int, int>> c = x => x + 1;

// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };

1
मैं यह समझने की कोशिश कर रहा हूं कि फंक ब्रेसिज़ की अनुमति क्यों देता है और अभिव्यक्ति की अनुमति नहीं देता है। वैसे भी एक्सप्रेशन को फंक के रूप में अनुपालन किया जाएगा, क्या एक्सप्रेशन ट्री में कई लाइन लॉजिक को जोड़ने का कोई तरीका है? यदि नहीं, तो उस पर प्रतिबंध क्यों हैं?
हबीब

8
@ हबीब: "वैसे भी एक्सप्रेशन को फंक के रूप में संकलित किया जाएगा" हमेशा नहीं। बहुत समय यह एक प्रतिनिधि के लिए कभी भी संकलित नहीं किया जाता है - बस डेटा के रूप में जांच की जाती है। .NET 4.0 में अभिव्यक्ति के पेड़ के माध्यम से कई बयान शामिल करने की क्षमता हासिल किया Expression.Block लेकिन सी # भाषा का समर्थन नहीं करता। यह हो सकता है, लेकिन इसके लिए अधिक डिजाइन / कार्यान्वयन / परीक्षण कार्य की आवश्यकता होगी।
जॉन स्कीट

26

आप एक लंबोदर अभिव्यक्ति में जितने चाहें उतने नए अंक डाल सकते हैं; C # नई कहानियों को अनदेखा करता है।

आप शायद कई बयानों के बारे में पूछना चाहते हैं ।

कई बयानों को ब्रेसिज़ में लपेटा जा सकता है।

प्रलेखन देखें ।


17
क्या यह कहना ज़्यादा सही नहीं होगा कि सी # व्हॉट्सएप को नई कहानियों के साथ समान रूप से व्यवहार करता है? यह कहने में थोड़ा भ्रामक लगता है कि यह नई कहानियों को नजरअंदाज करता है - यह ऐसा लगता है जैसे यह सिर्फ उन्हें पूरी तरह से बाहर निकालता है, और आप एक कीवर्ड को एक नई रेखा या कुछ पर विभाजित कर सकते हैं।
Tesserex

6

चूंकि C # 7:

सिंगल लाइन स्टेटमेंट:

int expr(int x, int y) => x + y + 1; 

बहुभाषी कथन:

int expr(int x, int y) { int z = 8; return x + y + z + 1; };

हालाँकि इन्हें स्थानीय कार्य कहा जाता है, मुझे लगता है कि यह निम्न की तुलना में थोड़ा साफ दिखता है और प्रभावी रूप से समान है

Func<int, int, int> a = (x, y) => x + y + 1;

Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };

4
Func<string, bool> test = (name) => 
{
   if (name == "yes") return true;
   else return false;
}

5
फ़ंक <string, bool> test = name => name == "yes";
asawyer

3
पॉलिटिक्स, मनोरंजक मनोरंजक सुझावों का नहीं, प्रश्न द्वारा अनुरोधित बहु-पंक्ति प्रारूप का प्रदर्शन कर रहा है। अपने बुद्धिमान कोड को लागू करने के लिए यह "एक जवाब नहीं" बना देगा!
कायुस जार्ड


0

सी # 7.0 के साथ आप इस तरह का भी उपयोग कर सकते हैं

Public string ParentMethod(int i, int x){
    int calculation = (i*x);
    (string info, int result) InternalTuppleMethod(param1, param2)
    {
        var sum = (calculation + 5);
        return ("The calculation is", sum);
    }
}

0

मान लें कि आपके पास एक वर्ग है:

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

इस वर्ग के अंदर C # 7.0 के साथ आप इसे कर्ली कोष्ठक के बिना भी कर सकते हैं:

Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);

तथा

Action<int, int> action = (x, y) => _ = (X += x, Y += y);

के रूप में ही होगा:

Action<int, int> action = (x, y) => { X += x; Y += y; };

यह तब भी मददगार हो सकता है जब आपको एक लाइन में एक नियमित विधि या कंस्ट्रक्टर लिखने की आवश्यकता होती है या जब आपको अधिक आवश्यकता होती है तो एक स्टेटमेंट / एक्सप्रेशन को एक एक्सप्रेशन में पैक करने की आवश्यकता होती है:

public void Action(int x, int y) => (_, _) = (X += x, Y += y);

या

public void Action(int x, int y) => _ = (X += x, Y += y);

या

public void Action(int x, int y) => (X, Y) = (X + x, Y + y);

दस्तावेज़ीकरण में ट्यूपल्स के विघटन के बारे में अधिक ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.