2010-03-03 7 views
14

मैं सी # के कार्यात्मक पक्ष में नया हूं, क्षमा करें यदि प्रश्न लंगड़ा है।अनाम विधि के माध्यम से अनाम प्रकार की संपत्ति असाइन करना

को देखते हुए निम्नलिखित गलत कोड:

var jobSummaries = from job in jobs 
        where ... 
        select new 
        { 
         ID = job.ID, 
         Description = job.Description, 
         FileName = (job) => { 
            // primitive logic not 
            // worth to become a named method 
            try { return job.Files[0].LocalName); } 
            catch { return null as string; } 
           } 
        }; 

इस कोड को निम्नलिखित उचित संकलक त्रुटि पैदा करता है:

cannot assign lambda expression to anonymous type property

कोड ऊपर फ़ाइल का नाम संपत्ति के लिए प्रतिनिधि तय करेगा। लेकिन यह मेरा लक्ष्य नहीं है। मैं चाहता हूं कि कोड इस तरह काम करे लेकिन विधि का नाम दिए बिना:

var jobSummaries = from job in jobs 
        where ... 
        select new 
        { 
         ID = job.ID, 
         Description = job.Description, 
         FileName = this.ExtractFileName(job) 
        }; 

... 
private string ExtractFileName(Job job) 
{ 
    try { return Path.GetFileName(job.Files[0].LocalName); } 
    catch { return null as string; } 
} 

कोई सुझाव?

उत्तर

16

सीधे एक गुमनाम समारोह कॉल करने के लिए, इस काम करता है:

int result = new Func<int, int>((int i) =>{ return i + 5; }).Invoke(3); 
// result = 8 

लेकिन मैं मानता हूँ, int result = (i => i + 5)(3); रास्ता कूलर होगा =)

3

जहाँ तक मुझे पता है, आप कर सकते हैं की तरह इनलाइन लैम्ब्डा भाव नहीं क्योंकि एक lamda अभिव्यक्ति एक उदाहरण है (प्रकार Expression<Func<T>> या इसी तरह के)।

var jobSummaries = from job in jobs 
        where ... 
        let fileName = job.Files.Select(f => f.LocalName).FirstOrDefault() 
        select new 
        { 
         ID = job.ID, 
         Description = job.Description, 
         FileName = fileName 
        }; 

सूचना let कीवर्ड का उपयोग करते हैं, आप फ़ाइल नाम निकालने की सुविधा देता है:

हालांकि, आप इस (के बाद से यह अब ओपी द्वारा प्रदान की गई , fileName की गणना के साथ अद्यतन) कर सकते हैं LINQ अभिव्यक्ति के अंदर सीधे job चर से।

+0

के अंदर अपना छोटा तर्क कर सकते हैं मैंने अभी कोशिश की है। मैं 'चलो' के साथ स्थानीय चर के रूप में लैम्ब्डा अभिव्यक्ति सेट नहीं कर सकता। मैंने नमूना कोड अपडेट किया। मेरे पास एक कोशिश/पकड़ है जो प्रत्यक्ष कंप्यूटिंग को मुश्किल बनाता है। – GarbageGuy

+0

नहीं, आप 'फ़ाइल नाम' में लैम्ब्डा अभिव्यक्ति निर्दिष्ट नहीं कर सकते हैं। बस कोड लिखें: 'fileName = path.Combine (job.Folder, job.File)' या जो भी तर्क आपको चाहिए ... –

+0

अज्ञात डाउनवोट क्यों? –

2

संकलक शिकायत कर रहा है क्योंकि आप बुला नहीं रहे अपने लैम्ब्डा समारोह, आप यह परिभाषित करने हैं। यदि कंपाइलर आपको देगा, तो आपके पास एक फ़ाइल नाम संपत्ति होगी जो एक मान के बजाय एक फ़ंक्शन है।

यदि आप अभिव्यक्ति के रूप में अपना "आदिम तर्क" लिख सकते हैं, तो आप इसे सीधे असाइनमेंट कथन में लिख सकते हैं।

0

चयन के लिए एक्सटेंशन का उपयोग करने के बारे में कैसे। तो आप

var jobSummaries = jobs.Select(j => 
      { 
       var someVar = j + "bla"; 
       return new 
        { 
         somelogic = someVar 
        }; 

      }); 
संबंधित मुद्दे