2010-04-25 7 views
5

MSDN Func Generic Delegate पर लेख में इस कोड उदाहरण देता है:Func <> प्रतिनिधि के लिए यह एमएसडीएन उदाहरण क्यों एक अनिवार्य चयन() कॉल है?

Func<String, int, bool> predicate = (str, index) => str.Length == index; 

String[] words = { "orange", "apple", "Article", "elephant", "star", "and" }; 
IEnumerable<String> aWords = words.Where(predicate).Select(str => str); 

foreach (String word in aWords) 
    Console.WriteLine(word); 

मैं समझता हूँ कि यह सब क्या कर रहा है। जो मुझे समझ में नहीं आता है वह

Select(str => str) 

बिट। निश्चित रूप से इसकी आवश्यकता नहीं है? आप इसे छोड़ देते हैं और सिर्फ

IEnumerable<String> aWords = words.Where(predicate); 

है तो आप अभी भी एक IEnumerable वापस कि एक ही परिणाम होता है मिलता है, और कोड एक ही बात प्रिंट करता है।

क्या मुझे कुछ याद आ रहा है, या उदाहरण भ्रामक है?

+0

मेरे द्वारा देखे जाने वाले उदाहरण में 'Func predicate = str => str.ToUpper() 'और कोई ऐसा' चयन' नहीं है। – zneak

+1

मैं इसे –

+0

@zneak से ऊपर प्रश्न में दिखाया गया है - आपने कौन सी भाषा चुनी है। – ChrisF

उत्तर

9

Select वास्तव में अनावश्यक है।

मुझे लगता है कि इस उदाहरण दिया हो सकता है क्वेरी समझ वाक्य रचना से "अनुवाद" है, के रूप में:

IEnumerable<String> aWords = 
    from w in words 
    where (...) 
    select w; 

इस वाक्य रचना का उपयोग करते समय, आप select अंत में करने के लिए है, यह सिर्फ तरीका बताया गया है कंपाइलर काम करता है। Where एक्सटेंशन विधि का उपयोग करते समय, हालांकि, यह पूरी तरह से अनावश्यक है जब तक कि आपको वास्तव में एक अलग प्रक्षेपण करने की आवश्यकता न हो।

या, शायद यह सिर्फ एक गलती है। एमएसडीएन लेखकों को अचूक नहीं है!

+0

क्या इसका मतलब है कि लैम्ब्डा सिंटैक्स अधिक कुशल है? – fearofawhackplanet

+0

@fearofawhackplanet: वे समान प्रश्न लिखने के समान, अलग-अलग तरीके हैं। – Aaronaught

1

नहीं इसकी आवश्यकता नहीं है।

इस तरह के निर्माण का उपयोग किया जा सकता है यदि आप अनुक्रम को आलसी मूल्यांकन के लिए मजबूर करना चाहते थे यानी कास्टिंग को रोकने के लिए। यदि आपके पास एक विधि है जो List<T> लौटा दी है लेकिन IEnumerable<T> रिटर्न प्रकार घोषित किया गया है तो क्लाइंट रिटर्न प्रकार डाला जा सकता है और सीधे अंतर्निहित सूची में हेरफेर कर सकता है। जाहिर है यह एक बहुत ही बुरा विचार है, लेकिन एक वर्ग एक पहचान इस उदाहरण में प्रयुक्त एक के रूप में इस तरह के चयन लगाने से अपने राज्य की रक्षा कर सकते हैं:

public IEnumerable<T> Items 
{ 
    get { return privateList.Select(i => i); } 
} 
+1

ऐसे मामलों में, मैं "निजी सूची लौटा दूंगा। केवल पढ़ने के लिए();" इसके बजाय, भले ही IENumerable लौट रहे हों। ReadOnlyCollection का लाभ यह है कि यह आईसीओलेक्शन लागू करता है, जो कुछ LINQ ऑपरेटरों (जैसे ToArray()) को तेज़ी से बनाता है क्योंकि संग्रह की लंबाई ज्ञात है। – Daniel

0

दरअसल, इसकी आवश्यकता नहीं है, msdn page के नीचे एक फीडबैक बटन है। उन्हें बताओ। चयन की जरूरत नहीं है। मात्र तथ्य यह है कि खंड का चयन सिर्फ है:

Select(str => str) 

यह स्ट्रिंग प्राप्त करता है और ही स्ट्रिंग

0

तुम वहाँ एक बहुत ही अजीब लिंक है आउटपुट। इस विषय को टीओसी में नहीं है, और यह है शीर्ष पर निम्न:

"[।। इस विषय को रिलीज प्रलेखन और आगामी रिलीज़ में परिवर्तन के अधीन है खाली विषयों प्लेसहोल्डर के रूप में शामिल किए गए हैं]"

पहली पंक्ति लेखक की टिप्पणी खुद की तरह दिखती है।

और चूंकि वीएस 2010 और .NET 4.0 अभी जारी किए गए हैं, मुझे लगता है कि यह किसी प्रकार का टूटा विषय है जिसे समय में हटाया/बदला नहीं गया है।

मुझे लगता है, इस सामग्री के लिए अब सही URL यह है: http://msdn.microsoft.com/en-us/library/bb534303.aspx

वैसे, कैसे आप अपने यूआरएल मिला? क्या यह एमएसडीएन खोज या कुछ और के माध्यम से था?

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