2009-11-29 8 views
7

क्या इसे फॉरएच में लैम्ब्डा अभिव्यक्ति में सशर्त ऑपरेटर रखने की अनुमति नहीं है?एक सामान्य सूची पर ForEach() में लैम्ब्डा अभिव्यक्ति में सशर्त ऑपरेटर का उपयोग करना?

List<string> items = new List<string>{"Item 1", "Item 2", "Item I Care About"}; 

string whatICareAbout = ""; 

// doesn't compile :(
items.ForEach(item => item.Contains("I Care About") ? 
whatICareAbout += item + "," : whatICareAbout += ""); 

संकलन त्रुटि ->

एक सामान्य उपयोग करने के लिए करता है, तो या तो काम नहीं करता है की कोशिश कर रहा "केवल काम, फोन, वेतन वृद्धि, घटती है, और नई वस्तु भाव एक बयान के रूप में इस्तेमाल किया जा सकता":

// :(
items.ForEach(item => if (item.Contains("I Care About")) {whatICareAbout += item + ", ";} 

बस संभव नहीं है?

+2

शीश मैं जवाबों के साथ असाधारण रूप से प्रभावित हूं, सभी पूछने के कुछ ही मिनटों में :) मुझे लगता है कि @ एसएलक्स मेरे प्रश्न के इरादे का जवाब देता है, लेकिन कुल() मेरे दिमाग को उड़ाता है! :) फिर से सभी को धन्यवाद :) – Jamezor

+1

आपके पास सशर्त अभिव्यक्ति के प्रकार के रूप में एक स्ट्रिंग अभिव्यक्ति थी, और आपको अपने FOREach() विधि के लिए एक कथन की आवश्यकता थी। यही कारण है कि संकलन त्रुटि वहां थी। –

+1

@Roman - मुझे अब मिल गया! मैं एक के बारे में सोचता हूँ? x: y के लिए शॉर्ट-हाथ के रूप में अगर (ए) {x} else {y} लेकिन? एक्स और वाई का मान देता है, जो इस मामले में एक स्ट्रिंग था ... – Jamezor

उत्तर

26

आप लैम्ब्डा अभिव्यक्तियों के छोटे रूप का उपयोग कर रहे हैं, जो केवल एक अभिव्यक्ति की अनुमति देता है।
आपको लंबे फॉर्म की आवश्यकता है, जो कई कथनों की अनुमति देता है।

उदाहरण के लिए:

items.ForEach(item => { 
    if (item.Contains("I Care About")) 
     whatICareAbout += item + ", "; 
}); 
1

कोशिश कोष्ठकों:

items.ForEach(item => item.Contains("I Care About") ? (whatICareAbout += item + ",") : (whatICareAbout += "")); 

+ = तुलना में एक उच्च पूर्वता, तुम क्यों त्रुटि हो रही है हो सकता है कि है?। कोष्ठक के साथ, त्रुटि दूर जा सकती है। इस बारे में 100% निश्चित नहीं है, हालांकि ... लैम्ब्डा अभिव्यक्तियों में अतिरिक्त प्रतिबंध हो सकते हैं जो असाइनमेंट स्टेटमेंट के उपयोग को रोकते हैं।

अद्यतन:

कई + = बयानों के बजाय

, यह एक बहुत क्लीनर है असाइनमेंट के दाएँ हाथ की ओर पर सशर्त डाल करने के लिए, इस तरह:

List<string> items = new List<string> { "one", "two", "three" }; 
string whatICareAbout = ""; 
items.ForEach(item => whatICareAbout += item.Contains("I Care About") ? (item + ",") : ""); 

अद्यतन 2:

लेकिन यह केवल सटीक() का उपयोग करना बेहतर है क्योंकि यह वास्तव में इस परिदृश्य के लिए डिज़ाइन किया गया है।

string whatICareAbout = items.Aggregate("", (total, item) => item.Contains("I Care About") ? (total + item + ",") : total); 

लेकिन मुझे लगता है ऊपर @Matt Breckon's जवाब (है कि मैं बस के रूप में मैं के बारे में इस पोस्ट करने के लिए था देखा था) के बाद से यह टर्मिनल को दूर करने के साथ संबंधित मेरी उदाहरण से भी बेहतर है ",": यहाँ एक नमूना है। उसका जवाब देखें ... :-)

5

आप क्या करने की कोशिश कर रहे हैं? क्या आप अल्पविराम से अलग वस्तुओं की एक स्ट्रिंग बनाने की कोशिश कर रहे हैं जहां उनमें एक विशेष मूल्य है? LINQ में आप इस निम्नलिखित का उपयोग कर प्राप्त होगा:

List<string> items = new List<string> { "Item 1", "Item 2", "Item I Care About", "Item I Care About", "Item I Care About" }; 
string whatICareAbout = items.Where(x => x.Contains("I Care About")) 
           .Aggregate((y, z) => y + ", " + z); 

उत्पादन इस से है "आइटम मैं चिंता करते हैं, मद मैं चिंता करते हैं, आइटम मैं के बारे में परवाह"।

नोट: सकल सुनिश्चित नहीं अनुगामी है की एक शानदार तरीका है ","

+0

कंसल्ट स्टिंग के लिए 'कुल' का उपयोग करना एक बहुत साफ विचार है जिसे मैंने नहीं सोचा है। आप आसानी से 'स्ट्रिंगबिल्डर' का उपयोग करने के लिए इसे बदल सकते हैं क्योंकि 'स्ट्रिंगबिल्डर' का एक धाराप्रवाह इंटरफ़ेस है। – SLaks

+0

हां, मैं बस अपने प्रारंभिक उत्तर में एक समग्र() कोड नमूना जोड़ रहा था ... लेकिन मुझे तुम्हारा बेहतर पसंद है। +1! –

4

समस्या यह है कि अभिव्यक्ति

item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += "" 

एक बयान नहीं है था। यह सिर्फ एक मान देता है जिसमें string टाइप किया गया है।

यह (सिर्फ मनोरंजन के लिए) काम करने के लिए एक चाल है: प्रारंभिक अभिव्यक्ति से एक बयान बनाने के लिए .GetType() विधि के लिए

items.ForEach(item => (item.Contains("I Care About") ? 
    whatICareAbout += item + "," : whatICareAbout += "").GetType()); 

मैं बस जोड़ा कॉल, और यह संकलित।

+0

और 'FOREach()' के लिए आपको एक कथन की आवश्यकता है :) –