.NET'te Haritalama ve Azaltma


Yanıtlar:


298

Harita ve Küçültün Linq eşdeğerleri: Linq'e sahip olacak kadar şanslıysanız, kendi haritanızı yazmanız ve işlevleri azaltmanız gerekmez. C # 3.5 ve Linq zaten farklı isimler altında da var.

  • Harita Select:

    Enumerable.Range(1, 10).Select(x => x + 2);
  • Azalt Aggregate:

    Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
  • Filtre Where:

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

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


1
Çeviri doğru, ancak önemli bir noktayı kaçırıyor. Harita küçültmedeki karışık adım, harita küçültmede kritik öneme sahiptir, ancak adın kendisinde herhangi bir kod yazmak zorunda olmadığı görünmez. Yalnızca harita adımında çıkarılan Anahtar tarafından çalıştırılır. Joel Martinez cevabı bence daha iyi.
xtofs

2
Bağlantı çalışmıyor, doğru bağlantı: justinshield.com/2011/06/mapreduce-in-c
Alexandru-Dan Pop

12
Neden oh neden sadece onu Reduceçağırmıyorlar Aggregate... MS sadece programcıları rahatsız etmeyi seviyor
John Henckel

13
@JohnHenckel, kesinlikle yetkili bir kaynak değilim, ancak bunun SQL'den geldiğinden eminim. Linq orijinal sql ile etkileşim C # kolaylaştırmak için bir yol olarak satın inanıyoruz. Bu dünyadaki işlevleri adlandırırken, toplama, Select ve Group By gibi şeylerle karşılaştırıldığında "azaltma" dan biraz daha tanıdık gelmeye başlar. Bunun doğru olduğunu söylemiyorum, beni hiçbir şekilde sinirlendirmiyor ama bunun sebebi olduğunu hayal ediyorum.
Elliot Blackburn

18

Bir mapreduce stil çözümü için çok uygun olan problem sınıfları toplama problemleridir. Veri kümesinden veri çıkarma. C # 'da, bu tarzda programlamak için LINQ yararlanabilir.

Aşağıdaki makaleden: http://codecube.net/2009/02/mapreduce-in-c-using-linq/

GroupBy yöntemi harita işlevi görürken, Select yöntemi ara sonuçları nihai sonuç listesine indirgeme işini yapar.

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);

Dağıtılmış bölüm için DryadLINQ'ya göz atabilirsiniz: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx


3

O LINQ diyor hatırlayabilir asla bu yana Where, Selectve Aggregateyerine Filter, Mapve Reduceben birkaç uzatma yöntemleri oluşturulan böylece kullanabilirsiniz:

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

İşte 3 yöntem ( https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csutil/collections/IEnumerableExtensions.cs adresinden ):

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 adresinden daha fazla ayrıntı :

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.