208

哪些场景需要使用“ Map and Reduce ”算法?


该算法是否有 .NET 实现?

4

3 回答 3

415

Map 和 Reduce 的 Linq 等价物:如果您有幸拥有 linq,那么您不需要编写自己的 map 和 reduce 函数。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/

于 2012-12-15T19:07:00.600 回答
23

非常适合 mapreduce 样式解决方案的问题类别是聚合问题。从数据集中提取数据。在 C# 中,可以利用 LINQ 以这种风格进行编程。

来自以下文章: http ://codecube.net/2009/02/mapreduce-in-c-using-linq/

GroupBy 方法充当地图,而 Select 方法将中间结果减少到最终结果列表中。

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

于 2009-03-02T20:58:29.230 回答
8

由于我不记得 LINQ 调用它WhereSelectAggregate不是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/csutil/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的更多详细信息:

在此处输入图像描述

于 2019-02-21T07:37:55.860 回答