2012-04-10 5 views
43

में लैम्ब्डा अभिव्यक्ति को समझना चाहता हूं, मैं सी # और एमवीसी में काफी नया हूं और कुछ अवसरों पर लैम्बडा का उपयोग किया है, जैसे अनाम विधियों और LINQ पर।मैं @ Html.DisplayFor (modelItem => item.FirstName)

(x => x.Name), (x => { Console.WriteLine(x)) 

मैं समझता हूँ कि लैम्ब्डा = "को जाता है":

आमतौर पर मैं लैम्ब्डा भाव है कि कुछ इस तरह दिखाई देखते हैं। मैंने कभी लैम्ब्डा अभिव्यक्ति नहीं देखी है जहां बाएं पैरामीटर का उपयोग नहीं किया जाता है।

मैं कैसे इस लैम्ब्डा अभिव्यक्ति हालांकि

@Html.DisplayFor(modelItem => item.FirstName) 

अनुवाद करने के लिए किसी को भी मेरे लिए इस पर कुछ प्रकाश डाला सकता है पता नहीं है? नहीं यह होना चाहिए

(modelItem => modelItem.FirstName)? 

मैं माइक्रोसॉफ्ट के Introduction to ASP.NET MVC tutorial से मिला है।

+0

आपको लगता है कि क्रियान्वयन का परीक्षण किया है: इसके बजाय एचटीएमएल सहायक वर्ग का उपयोग कर के, हम बस सही उत्पादन इस प्रकार प्रदान कर सकते हैं? क्या यह काम करता है? इस तरह से डॉट नोटेशन का उपयोग करना अच्छा लगेगा, मैं इंप्रेशन के तहत था कि इसे केवल इंडेक्स के माध्यम से एक्सेस किया जा सकता था। –

+0

हाँ, यह वही है जो मैं ट्यूटोरियल दिखाता हूं और इसे थोड़ी देर के लिए कर रहा हूं। मैंने हमेशा सोचा है, क्यों मॉडल Item => modelItem.FirstName ... ने भी कोशिश की और काम नहीं किया। हां, यह डॉट-नोटेशन का उपयोग करने के लिए बहुत बेहतर होगा। ऐसा लगता है कि मुझे एक तरह से "हैक" लगता है। मुझे आशा है कि भविष्य में डॉट-नोटेशन संभव होगा .. –

+0

'ग्रीममिलर के लिंक के मुताबिक, एक और उचित तरीका '@ एचटीएमएल। डिस्प्लेफोर (() => आइटम। फर्स्टनाम)' –

उत्तर

89

एक लैम्ब्डा अभिव्यक्ति एक अज्ञात फ़ंक्शन लिखने का एक तरीका है, यानी नाम के बिना कोई फ़ंक्शन। "तीर" के बाईं तरफ आपके पास फ़ंक्शन पैरामीटर हैं, और आपके पास दाईं ओर क्या है फ़ंक्शन बॉडी है। इस प्रकार, (x => x.Name) तार्किक रूप से string Function(Data x) { return x.Name } जैसे string और Data पर कुछ रूप से अनुवाद करता है, स्पष्ट रूप से भिन्न होगा और संदर्भ से लिया जाएगा।

बाईं ओर पैरामीटर के अभाव पैरामीटर के बिना एक समारोह में तब्दील हो, ताकि इस (() => someVariable) तार्किक इस के लिए अनुवाद: string Function() { return someVariable; }

इस बिंदु आप सोच, जहां someVariable से आता है शुरू हो सकता है, यह एक समारोह नहीं है पैरामीटर और यह फ़ंक्शन में परिभाषित नहीं है। आप सही होंगे, इस तरह का एक समारोह कभी संकलित नहीं होगा। हालांकि इस तरह का लैम्ब्डा फ़ंक्शन पूरी तरह ठीक है, क्योंकि यह बाहरी-स्कोप चर को हटाया जाता है और इस तरह उपयोग किया जाता है। (आंतरिक रूप से एक रैपर वर्ग बनाया जाता है जहां लैम्ब्डा अभिव्यक्ति में उपयोग किए जाने वाले चर फ़ील्ड बन जाते हैं।)

अब देखते हैं कि model => item.FirstName का अर्थ क्या है। तर्कसंगत रूप से यह string Function(Model model) { return item.FirstName; } में अनुवाद करेगा। असल में यह एक पैरामीटर के साथ एक समारोह है, लेकिन इस पैरामीटर का उपयोग नहीं किया जाता है।

और अब, जानकारी का अंतिम भाग। यद्यपि लैम्ब्डा अभिव्यक्ति अंत में कार्यों का प्रतिनिधित्व करती है, कभी-कभी उन्हें वास्तव में निष्पादित करने के उद्देश्य से नहीं बनाया जाता है (हालांकि संभावित रूप से वे कर सकते हैं)। एक लैम्ब्डा अभिव्यक्ति को अभिव्यक्ति वृक्ष के रूप में दर्शाया जा सकता है। इसका मतलब है कि इसे निष्पादित करने के बजाय यह पार्स किया जा सकता है।

इस विशेष मामले में एमवीसी इंजन चलाता है जो लैम्ब्डा अभिव्यक्ति का प्रतिनिधित्व करता है। इसके बजाय अभिव्यक्ति पार्स है ताकि एमवीसी इंजन जानता है कि इस विशेष पंक्ति के लिए कौन सी एचटीएमएल उत्सर्जित हो। यदि आपका डेटा आइटम सीधे आपके मॉडल ऑब्जेक्ट से नहीं आता है, तो लैम्ब्डा अभिव्यक्ति का बायां हिस्सा कोई फर्क नहीं पड़ता।

+0

ग्रेट स्पष्टीकरण। मेरा जवाब निश्चित रूप से इस अच्छी तरह लिखित एक के लिए अनचेक किया जाना चाहिए :) – GraemeMiller

+0

@GraemeMiller हाँ मुझे लगता है कि इस आदमी को अपने कड़ी मेहनत के लिए बहुत सारे क्रेडिट और सम्मान का हकदार है। धन्यवाद। निश्चित रूप से लैम्ब्डा, एमवीसी इंजन, और पैरामीटर रहित लैम्ब्डा के संबंध में एक बहुत ही सुंदर जवाब :) –

+3

@zespri उत्तर के लिए बहुत बहुत धन्यवाद। निश्चित रूप से एक पूरी तरह से और भेड़ के बच्चे और एमवीसी इंजन के बारे में मेरी बेहोश जिज्ञासा का जवाब दिया :) –

4

यह पैरामीटर रहित लैम्बाडा का उपयोग कर रहा है। (() यह कुछ भी मैं उपयोग कहेंगे हो सकता है _ या) और बस पाश इसके खिलाफ displayfor का उपयोग करने के लिए भीतर लैम्ब्डा समारोह का उपयोग करता है इस question

मूल रूप से DisplayFor लैम्ब्डा समारोह पैरामीटर मॉडल का उपयोग नहीं करता है। DisplayFor को एक लैम्ब्डा फ़ंक्शन की आवश्यकता होती है।

6

मुझे लगता है कि यह foreach पाश के बारे में है। उदाहरण:

@foreach(var item in model) 
{ 
<td> 
    @html.displayfor(model => item.firstName) </td> 
</td>  
} 

var item इस्तेमाल किया जा सकता है क्योंकि क्रम में प्रत्येक आइटम एक गुमनाम प्रकार है की जरूरत है। model => item.firstName का अर्थ है (input parameter) => expression। आप इनपुट पैरामीटर का उपयोग नहीं कर सकते क्योंकि हम वर्तमान "आइटम" को item में संग्रहीत करते हैं।

+0

धन्यवाद! मुख्य उत्तर (सुंदर लेकिन सुंदर सार) पढ़ने के बाद, इसने मेरे नौसिखिया दिमाग के लिए इसे और अधिक व्यावहारिक तरीके से स्पष्ट करने में मदद की :-) – Methodician

1

मैंने विजुअल स्टूडियो द्वारा उत्पन्न कोड को समझने के लिए भी बहुत कुछ संघर्ष किया। लैम्ब्डा अभिव्यक्ति के बारे में एक सामान्य स्पष्टीकरण प्रदान करने के बजाय, मैं एएसपी.नेट एमवीसी ढांचे का उपयोग कर एक संदर्भ रखना चाहता हूं।

मान लीजिए कि हमने 2 गुणों के साथ एक मॉडल वर्ग (उदा। गंतव्य) तैयार किया है: शहर और प्रांत कोड।

public class Destination 
{ 
    public string City { get; set; } 
    public string ProvinceCode { get; set; } 
} 

नियंत्रक और दृश्य उत्पन्न करने के बाद, हमें विजुअल स्टूडियो द्वारा जेनरेट किए गए कोड प्राप्त किए जाने चाहिए। फिर भी, कोड जनरेट किए गए विशेष रूप से डेटा पंक्तियों

@Html.DisplayFor(modelItem => item.City) 

मैं सिर्फ लगता MVC टीम सोचना चाहिए कि जो HTML सहायक वर्ग लगातार cshtml फ़ाइल में इस्तेमाल किया जाना चाहिए के लिए, कुछ हद तक समझने के लिए मुश्किल है। इस प्रकार, उन्होंने सी # कंपाइलर को पारित करने के लिए चाल का उपयोग करने की कोशिश की। इस मामले में, मॉडलइटम को इस लैम्ब्डा अभिव्यक्ति के इनपुट पैरामीटर के रूप में भी उपयोग नहीं किया जाता है। हम() का उपयोग नहीं कर सकते हैं क्योंकि प्रकार सही नहीं है। यही कारण है कि, यदि हम मॉडल या किसी मॉडल ऑब्जेक्ट को प्रतिस्थापित करते हैं, तो लैम्ब्डा अभिव्यक्ति कार्य करती है।

ईमानदार होने के लिए, मैं जेनरेट कोड को अधिक पठनीय रूप में फिर से लिखना चाहता हूं।

@foreach (var item in Model) { 
<tr>   
    <td> 
     @* Code Generated by Visual Studio. modelItem is a dummy param *@ 
     @Html.DisplayFor(modelItem => item.City) 
    </td> 
    <td> 
     @* A better way - simply get rid of Html helper class *@ 
     @item.ProvinceCode 
    </td> 
</tr> 
} 
संबंधित मुद्दे