.NET中的映射和精简


Answers:


298

Linq等同于Map and Reduce:如果您很幸运拥有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/


1
翻译是正确的,但没有重点。map reduce中的shuffle步骤对于map-reduce至关重要,但是不会以不必为其编写任何代码的名称显示。它仅由在映射步骤中提取的密钥驱动。乔尔·马丁内斯(Joel Martinez)的回答突出了我的观点。
xtofs

2
链接无效,正确的链接是:justinshield.com/2011/06/mapreduce-in-c
Alexandru-Dan Pop

12
为什么?为什么他们不直接调用它Reduce而不是Aggregate... MS只是喜欢使程序员烦恼
John Henckel

13
@JohnHenckel,我绝对不是权威人士,但是我很确定这来自SQL。我相信linq最初是作为在C#中与sql进行交互的一种方式而购买的。当您在那个世界中命名函数时,与Select和Group By之类的东西相比,aggregate听起来比“ reduce”更熟悉。我并不是说这是对的,这使我无休无止,但我想这就是原因。
艾略特·布莱克本

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

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


3

因为我从来不记得是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

以下是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的更多详细信息:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.