.NET में मैप और रिड्यूस करें


जवाबों:


298

मैप और रिड्यूस के लाइनक समतुल्य: यदि आप लाइनक के लिए पर्याप्त भाग्यशाली हैं तो आपको अपना नक्शा लिखने और कार्यों को कम करने की आवश्यकता नहीं है। C # 3.5 और Linq के पास पहले से ही अलग-अलग नामों के तहत है।

  • नक्शा है Select:

    Enumerable.Range(1, 10).Select(x => x + 2);
  • कम करें Aggregate:

    Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
  • फ़िल्टर है Where:

    Enumerable.Range(1, 10).Where(x => x % 2 == 0);

https://www.justinshield.com/2011/06/mapreduce-in-c/


1
अनुवाद सही है लेकिन यह एक महत्वपूर्ण बिंदु याद करता है। नक्शा कम करने में फेरबदल कदम नक्शे को कम करने में महत्वपूर्ण है, लेकिन नाम में नहीं दिखा है किसी को इसके लिए कोई कोड लिखने की ज़रूरत नहीं है। यह पूरी तरह से कुंजी द्वारा संचालित है जो मानचित्र चरण में निकाला जाता है। जोएल मार्टिनेज ने कहा कि मेरे विचार में बेहतर है।
xtofs

2
लिंक काम नहीं कर रहा है, सही लिंक है: justinshield.com/2011/06/mapreduce-in-c
अलेक्जेंड्रू-डैन पॉप

12
ओह क्यों वे इसके Reduceबजाय बस फोन नहीं करते हैं Aggregate... एमएस सिर्फ
गुस्सा

13
@ जॉनहेनकेल, मैं निश्चित रूप से एक आधिकारिक स्रोत नहीं हूं, लेकिन मुझे पूरा यकीन है कि यह एसक्यूएल से आता है। मेरा मानना ​​है कि linq मूल # सी में sql आसान के साथ बातचीत करने के रूप में खरीदा गया था। जब आप उस दुनिया में फ़ंक्शंस का नामकरण कर रहे हों, तो एग्‍लेक्ट और ग्रुप बाय जैसी चीज़ों के साथ तुलना करने पर एग्रीगेट "कम" की तुलना में थोड़ा अधिक परिचित लगने लगता है। मैं यह नहीं कह रहा कि यह सही है, यह मुझे कोई अंत नहीं करने की घोषणा करता है लेकिन मुझे लगता है कि इसका कारण है।
इलियट ब्लैकबर्न

18

समस्या की कक्षाएं जो एक मानचित्रण शैली समाधान के लिए अच्छी तरह से अनुकूल हैं, एकत्रीकरण की समस्याएं हैं। डेटासेट से डेटा निकालने का। C # में, कोई इस शैली में प्रोग्राम करने के लिए LINQ का लाभ उठा सकता है।

निम्नलिखित लेख से: http://codecube.net/2009/02/02/mapreduce-in-c-use-linq/

GroupBy विधि मानचित्र के रूप में कार्य कर रही है, जबकि चयन विधि मध्यवर्ती परिणामों को कम करने का काम परिणामों की अंतिम सूची में करती है।

var wordOccurrences = words
                .GroupBy(w => w)
                .Select(intermediate => new
                {
                    Word = intermediate.Key,
                    Frequency = intermediate.Sum(w => 1)
                })
                .Where(w => w.Frequency > 10)
                .OrderBy(w => w.Frequency);

वितरित भाग के लिए, आप DryadLINQ: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx देख सकते हैं


3

चूँकि मैं कभी याद नहीं कर सकता कि LINQ इसे कॉल करता है Where, Selectऔर Aggregateइसके बजाय Filter, Mapऔर Reduceइसलिए मैंने कुछ विस्तार विधियाँ बनाईं जिनका आप उपयोग कर सकते हैं:

IEnumerable<string> myStrings = new List<string>() { "1", "2", "3", "4", "5" };
IEnumerable<int> convertedToInts = myStrings.Map(s => int.Parse(s));
IEnumerable<int> filteredInts = convertedToInts.Filter(i => i <= 3); // Keep 1,2,3
int sumOfAllInts = filteredInts.Reduce((sum, i) => sum + i); // Sum up all ints
Assert.Equal(6, sumOfAllInts); // 1+2+3 is 6

यहाँ 3 विधियाँ हैं ( https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csilil/collections/IEnumerableExtensions.cs ):

public static IEnumerable<R> Map<T, R>(this IEnumerable<T> self, Func<T, R> selector) {
    return self.Select(selector);
}

public static T Reduce<T>(this IEnumerable<T> self, Func<T, T, T> func) {
    return self.Aggregate(func);
}

public static IEnumerable<T> Filter<T>(this IEnumerable<T> self, Func<T, bool> predicate) {
    return self.Where(predicate);
}

Https://github.com/cs-util-com/cscore#ienumerable-extensions से कुछ और विवरण :

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.