在.NET中映射和减少

Dev*_*per 130 c# mapreduce

哪些情况可以保证使用" Map and Reduce "算法?


这个算法有.NET实现吗?

Ton*_*ony 253

Linq等同于Map和Reduce:如果你有幸拥有linq,那么你不需要编写自己的地图并减少功能.C#3.5和Linq已经拥有它,虽然名称不同.

Enumerable.Range(1, 10).Select(x => x + 2);
Run Code Online (Sandbox Code Playgroud)

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

  • @KostiantynKolesnichenko 映射/归约函数和编程模型的概念远远早于 JavaScript。我正在努力寻找规范的来源,但他们已经从事函数式编程数十年了。所以,这一次这不是 JavaScript 的错,它实际上比 C# 更标准! (9认同)
  • **为什么哦为什么**他们不只是称其为“ Reduce”而不是“ Aggregate` ...” MS只是喜欢惹恼程序员 (5认同)
  • @JohnHenckel,我绝对不是权威人士,但是我很确定这来自SQL。我相信linq最初是作为在C#中简化与sql交互的方式而购买的。当您在那个世界中命名函数时,与“选择”和“分组依据”之类的东西相比,聚合听起来比“减少”听起来更加熟悉。我并不是说这是对的,这使我无休无止,但我想这就是原因。 (4认同)
  • @ElliotBlackburn +1,但不仅如此,我很确定当 LINQ 首次引入时(2007 年),JavaScript 标准中没有“reduce”这样的函数。https://caniuse.com/?search=reduce 所以我们最好抱怨 JavaScript 的作者选择“reduce”而不是“aggregate” (4认同)
  • 链接不起作用,正确的链接是:https://www.justinshield.com/2011/06/mapreduce-in-c/ (2认同)
  • 在攻击 Aggregate 这个名字之前,您可能需要做一些研究,了解创建 LINQ 的研究和开发工作量以及 LINQ 的目标是什么。首先,它代表语言集成查询。因此,LINQ 的全部目的是为编程语言提供与 SQL 相同的灵活性,并赋予它相同的感觉。目标不是引入函数式编程,尽管函数式编程是用来实现这些目标的。在 SQL 中,有一个名为 AGGREGATE() 的函数,但也有 SUM() AVG() MIN() MAX() - 这些函数在 LINQ 中也可用 (2认同)

Joe*_*nez 18

非常适合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);
Run Code Online (Sandbox Code Playgroud)

对于分布式部分,您可以查看DryadLINQ:http: //research.microsoft.com/en-us/projects/dryadlinq/default.aspx


小智 7

因为我从来不记得是LINQ调用它WhereSelectAggregate代替FilterMapReduce让我创建了一些扩展方法,你可以使用:

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
Run Code Online (Sandbox Code Playgroud)

以下是 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);
}
Run Code Online (Sandbox Code Playgroud)

来自https://github.com/cs-util-com/cscore#ienumerable-extensions 的更多细节:

在此处输入图片说明