2012-08-03 12 views
6

में ऑब्जेक्ट के मान सेट करना मैं LINQ का उपयोग कर रहा हूं ताकि twoWords ऑब्जेक्ट को List में ऑब्जेक्ट्स में चुन सकें और फ़ंक्शन/विधि को कॉल करके मान सेट कर सकें।LINQ नई ऑब्जेक्ट का चयन करें, फंक्शन

कृपया देखें कि क्या यह समझ में आता है, मैंने इसे बहुत सरल बना दिया है। मैं वास्तव में linq स्टेटमेंट fromselect का उपयोग करना चाहता हूं।

GOGO में पहली समारोह काम करेंगे, एक दूसरे में विफल रहता है

// simple class containing two strings, and a function to set the values 
public class twoWords 
{ 
    public string word1 { get; set; } 
    public string word2 { get; set; } 

    public void setvalues(string words) 
    { 
     word1 = words.Substring(0,4); 
     word2 = words.Substring(5,4); 
    } 
} 

public class GOGO 
{ 

    public void ofCourseThisWillWorks() 
    { 
     //this is just to show that the setvalues function is working 
     twoWords twoWords = new twoWords(); 
     twoWords.setvalues("word1 word2"); 
     //tada. object twoWords is populated 
    } 

    public void thisdoesntwork() 
    { 
     //set up the test data to work with 
     List<string> stringlist = new List<string>(); 
     stringlist.Add("word1 word2"); 
     stringlist.Add("word3 word4"); 
     //end setting up 

     //we want a list of class twoWords, contain two strings : 
     //word1 and word2. but i do not know how to call the setvalues function. 
     List<twoWords> twoWords = (from words in stringlist 
          select new twoWords().setvalues(words)).ToList(); 
    } 
} 

GOGO की दूसरी समारोह एक त्रुटि का कारण होगा (वे एक ही काम है, हालांकि प्रदर्शन नहीं करते):

चयनित खंड में अभिव्यक्ति का प्रकार गलत है। 'चयन' पर कॉल में अनुमान लगाया गया।

मेरा प्रश्न है, मैं ऊपर from खंड में नई twoWords वस्तु कैसे चयन करते हैं, setvalues समारोह का उपयोग कर मूल्यों को सेट करते समय है?

+4

एक तरफ, यह * वास्तव में * पठनीयता में मदद करता है यदि आप सरल नमूना कोड के लिए भी .NET नामकरण सम्मेलनों का पालन करते हैं । –

उत्तर

18

आपको एक कथन लैम्बडा का उपयोग करने की आवश्यकता है, जिसका अर्थ है एक क्वेरी अभिव्यक्ति का उपयोग नहीं करना।

private static twoWords CreateTwoWords(string words) 
{ 
    var ret = new twoWords(); 
    ret.setvalues(words); 
    return ret; 
} 

List<twoWords> twoWords = stringlist.Select(CreateTwoWords) 
            .ToList(); 
: इस मामले में मैं एक प्रश्न अभिव्यक्ति वैसे भी उपयोग नहीं होता है, यह देखते हुए कि आप केवल कुछ चुनिंदा लोगों मिल गया है ...

List<twoWords> twoWords = stringlist.Select(words => { 
               var ret = new twoWords(); 
               ret.setvalues(words); 
               return ret; 
              }) 
            .ToList(); 

या वैकल्पिक रूप से, बस एक तरीका है जिसके रिटर्न एक उपयुक्त twoWords है

यह भी आप किसी क्वेरी अभिव्यक्ति का उपयोग करता है, तो क्या तुम सच में करना चाहता था चलो होगा:

List<twoWords> twoWords = (from words in stringlist 
          select CreateTwoWords(words)).ToList(); 

बेशक एक और विकल्प होगा twoWords एक निर्माता देने के लिए जो एच ने सही शुरुआत करने के लिए सही काम किया था, जिस बिंदु पर आपको केवल एक विधि को कॉल करने की आवश्यकता नहीं होगी ...

+0

धन्यवाद जॉन। यह निश्चित रूप से मेरे प्रश्न के लिए काम करेगा। ब्याज के लिए, अगर मैं एक क्वेरी अभिव्यक्ति का उपयोग करना चाहता था, और दो शब्द वर्ग को रखना है? क्या यह संभव है? मेरे इस तरह वास्तविक चयन दिखता है: सूची twoWords = (xmlDoc.Descendants में मेनू ("मेनू") से जहां (menu.Elements में स्ट्रिंग) menu.Attribute ("प्रकार") == menuType शब्द से ("आइटम") नए दो शब्द() सेट करें। सेटएट्रिब्यूट्स (शब्द) ) .ToList(); –

+1

@ डेविडमिट: आप इसे कर सकते हैं, लेकिन केवल एक सहायक विधि के साथ (नीचे भाग के अनुसार)। प्रश्न अभिव्यक्ति * केवल * अभिव्यक्ति lambdas की अनुमति दें। मदद के लिए –

+0

धन्यवाद जॉन! –

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