"तह" LINQ एक्सटेंशन विधि कहाँ है?


94

मैंने MSDN के Linq नमूने में तह () का एक साफ तरीका पाया है जिसका मैं उपयोग करना चाहता हूं। उनका उदाहरण:

double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; 
double product = 
     doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 

दुर्भाग्य से, मैं यह संकलन करने के लिए, उनके उदाहरण में या अपने स्वयं के कोड में नहीं प्राप्त कर सकता, और मैं MSDN (Enumerable या Array एक्सटेंशन विधियों जैसे) को इस विधि का उल्लेख करने के लिए कहीं और नहीं मिल सकता। मुझे जो त्रुटि मिली है वह एक पुरानी पुरानी है "उस त्रुटि के बारे में कुछ भी नहीं जानते हैं:"

error CS1061: 'System.Array' does not contain a definition for 'Fold' and no 
extension method 'Fold' accepting a first argument of type 'System.Array' could 
be found (are you missing a using directive or an assembly reference?)

मैं अन्य तरीकों का उपयोग कर रहा हूं, जो मुझे लगता है कि लिनक से आते हैं (जैसे चयन करें () और कहां ()), और मैं "System.Linq का उपयोग कर रहा हूं", इसलिए मुझे लगता है कि यह सब ठीक है।

क्या यह विधि वास्तव में C # 3.5 में मौजूद है, और यदि हां, तो मैं क्या गलत कर रहा हूं?


3
आपके द्वारा संदर्भित नमूने पृष्ठ पर ब्रेड क्रम्ब ट्रेल * देखें - यह भविष्य के उत्पाद के रूप में C # 3 को संदर्भित करता है। भविष्य के उत्पाद अक्सर जहाज से पहले बदलते हैं। अन्य लोगों की तरह, Enumerable.Aggregate देखें और मज़े करें। :) * विज़ुअल सी # डेवलपर सेंटर> होम> उत्पाद जानकारी> भविष्य के संस्करण> 101 LINQ नमूने> एग्रीगेट ऑपरेटर्स
कर्ट निकोल्स

जवाबों:


125

आप Aggregateएक्सटेंशन विधि का उपयोग करना चाहेंगे :

double product = doubles.Aggregate(1.0, (prod, next) => prod * next);

अधिक जानकारी के लिए MSDN देखें । यह आपको seedक्रमिक मूल्यों की गणना करने के लिए एक और फिर एक अभिव्यक्ति निर्दिष्ट करने देता है ।


4
यह ध्यान दिया जाना चाहिए कि आपके पास एक बीज नहीं है, या तो। यदि आप उस अधिभार को कहते हैं जिसमें कोई बीज नहीं है तो सूची में पहले तत्व का उपयोग प्रारंभिक कुल मूल्य के रूप में किया जाता है और Funcकेवल एक बार दूसरे तत्व तक पहुंचने के बाद कहा जाता है। देखें: msdn.microsoft.com/en-us/library/vstudio/…
जोश

अगर मैं सही समझ रहा हूं तो यह गुना नहीं है: / तह को विभिन्न प्रकार के दोनों तर्कों को स्वीकार करना चाहिए। जैसे कि पहला arg एक स्ट्रिंग का उपयोग कर सकता है, और दूसरा arg किसी भी चीज़ के साथ हो सकता है ToString(), इस प्रकार पूरे कंटेनर का टेक्स्ट प्रतिनिधित्व वापस कर सकता है।
हाय-एंजेल

@ हाय-एंजेल, नहीं, उदाहरण वास्तव में एक गुना है। <double>प्रकार पैरामीटर सिर्फ स्वचालित: संग्राहक द्वारा आवश्यक नहीं अनुमान लगाया है और इस तरह है।
kdbanman

1
@ हाय-एंजेल, pऔर elemआप जो चाहें टाइप कर सकते हैं। इस ओवरलोड को इस उदाहरण
kdbanman

1
@kdbanman इर्र, ⁺¹, यह वास्तव में दिलचस्प है कि क्यों समय में यह मेरे लिए काम नहीं करता है ...: / आप सही हैं, यह काम करता है।
हाय-एंजेल

41

गुना (उर्फ रिड्यूस) कार्यात्मक प्रोग्रामिंग से मानक शब्द है। जो भी कारण के लिए, यह LINQ में Aggregate नाम मिला ।

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);

9
समुच्चय OO और SQL स्थानों में एक अधिक परिचित शब्द है।
एडम रॉबिन्सन

3
क्रिएट एजग्रेट कीवर्ड ( msdn.microsoft.com/en-us/library/ms182741.aspx ) के बारे में पता नहीं था, हर दिन कुछ नया सीखें।
रिचर्ड बर्ग

5
मजेदार, मैंने SQL के बाहर कभी "एग्रीगेट" नहीं सुना है। WP में कुछ दर्जन भाषाओं की सूची en.wikipedia.org/wiki/Fold_(higher-order_function) है और C # एक ही है जो इसे "एग्रीगेट" कहता है। "कम" स्पष्ट विजेता है, जिसके बाद एमएल परिवार के लिए "गुना", और स्मॉलटाक और दोस्तों के लिए "इंजेक्ट" है।
केन

12
नाम इसकी कार्यक्षमता का विषय है; यह कैसे लागू किया जाता है यह अप्रासंगिक है। और एफडब्ल्यूआईडब्ल्यू, बाएं सिलवटों को जब संभव हो तो इसे लागू किया जाता है ... कार्यात्मक भाषाओं में आमतौर पर पूंछ पुनरावृत्ति के माध्यम से। और सी # में एक सही तह नहीं है, जो एक बेवकूफ नाम चुनने के परिणामस्वरूप है - हालांकि "मानचित्र" के लिए "चयन" जितना बुरा नहीं है - और मौजूदा कार्यात्मक तकनीक की अनदेखी। के रूप में सकल OO दायरे में एक अधिक परिचित शब्द होने के लिए ... नहीं, बिल्कुल नहीं।
जिम बैटर

9
निष्पक्ष होने के लिए, मुझे नहीं लगता कि यह Microsoft की मौजूदा कार्यात्मक प्रौद्योगिकी या शब्दावली की अवहेलना है, लेकिन डेटाबेस एक्सेस और एसक्यूएल की शब्दावली के प्रति इसकी अभिविन्यास है, जो कई एंटरप्राइज़ प्रोग्रामर संभवतः कार्यात्मक प्रोग्रामिंग शब्दों की तुलना में अधिक परिचित हैं।
रावुअल्हेमियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.