如果不知道MapReduce是怎么工作的,请看这里,如果不知道MapReduce是什么,请google之!

今天“闲”来无事,忽想起C#里没有MapReduce的方法,构思之,coding之:

#region IEnumerable<T>.MapReduce
        public static Dictionary<TKey, TResult> MapReduce<TInput, TKey, TValue, TResult>(
            this IEnumerable<TInput> list,
            Func<TInput, IEnumerable<KeyValuePair<TKey, TValue>>> map,
            Func<TKey, IEnumerable<TValue>, TResult> reduce)
        {
            Dictionary<TKey, List<TValue>> mapResult = new Dictionary<TKey, List<TValue>>();
            foreach (var item in list)
            {
                foreach (var one in map(item))
                {
                    List<TValue> mapValues;
                    if (!mapResult.TryGetValue(one.Key, out mapValues))
                    {
                        mapValues = new List<TValue>();
                        mapResult.Add(one.Key, mapValues);
                    }
                    mapValues.Add(one.Value);
                }
            }
            var result = new Dictionary<TKey, TResult>();
            foreach (var m in mapResult)
            {
                result.Add(m.Key, reduce(m.Key, m.Value));
            }
            return result;
        }
        #endregion

注:由于在map方法里可emit多次,所以这里返回IEnumerable,下文例子中可以看到用yield return来实现。

例:

    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
        static void Main(string[] args)
        {
            List<Person> list=new List<Person> ();
            list.Add(, Name= });
            list.Add(, Name =  });
            list.Add(, Name =  });
            list.Add(, Name =  });
            list.Add(, Name =  });

            var result = list.MapReduce<Person, int, string, string>(Map,
                (key, values) => string.Join(",", values));

            foreach (var d in result)
            {
                Console.WriteLine(d.Key + ":" + d.Value);
            }
        }

        public static IEnumerable<KeyValuePair<int, string>> Map(Person p)
        {
            )
                yield return new KeyValuePair<int, string>(p.Age, p.Name);
        }

上面程序所做的事为统计年龄大于22的,各个年龄都有谁,显示如:

C:\Windows\system32\cmd.exe

23:user1,user3
24:user2
25:user4
请按任意键继续。。。

(嫌上传图片太麻烦,弄了个html版控制台,见谅!)

肯定有人会问为什么map不像reduce方法一样用lambda表达式,因为yield return不能在匿名方法和lambda表达式中!MS表示已知道这个问题,但重写yield花费很大,将来肯定会解决!

C#版的MapReduce的更多相关文章

  1. Hadoop 之 MapReduce 框架演变详解

    经典版的MapReduce 所谓的经典版本的MapReduce框架,也是Hadoop第一版成熟的商用框架,简单易用是它的特点,来看一幅图架构图: 上面的这幅图我们暂且可以称谓Hadoop的V1.0版本 ...

  2. Hadoop,MapReduce操作Mysql

    前以前帖子介绍,怎样读取文本数据源和多个数据源的合并:http://www.cnblogs.com/liqizhou/archive/2012/05/15/2501835.html 这一个博客介绍一下 ...

  3. mapreduce编程--(准备篇)

    mapreduce编程准备 学习mapreduce编程之前需要做一些概念性的了解,这是做的一些课程学习笔记,以便以后时不时的翻出来学习下,之前看过一篇文章大神们都是时不时的翻出基础知识复习下,我也做点 ...

  4. Hadoop MapReduce八大步骤以及Yarn工作原理详解

    Hadoop是市面上使用最多的大数据分布式文件存储系统和分布式处理系统, 其中分为两大块分别是hdfs和MapReduce, hdfs是分布式文件存储系统, 借鉴了Google的GFS论文. MapR ...

  5. hadoop生态圈介绍

    原文地址:大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍   1. hadoop 生态概况 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分 ...

  6. 大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍

    Technorati 标记: hadoop,生态圈,ecosystem,yarn,spark,入门 1. hadoop 生态概况 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用 ...

  7. 转:最近5年133个Java面试问题列表

    最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...

  8. Hadoop日记Day1---Hadoop介绍

    一.Hadoop项目简介 1. Hadoop是什么 Hadoop是一个适合大数据的分布式存储与计算平台. 作者:Doug Cutting:Lucene,Nutch. 受Google三篇论文的启发 2. ...

  9. Java笔试题解答和部分面试题

    面试类  银行类的问题 问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你 ...

随机推荐

  1. <a>标签,鼠标经过或者停留触发延时响应事件

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAAEoCAIAAACmeX2PAAAgAElEQVR4nOzdd3xUdb74f3+Pu3v33t ...

  2. android ListView 和 BaseAdapter 应用

    步聚: 1.建立ListView对象:--(作用:绑定Adapter呈现数据) 2.建立ListView实现的Item栏位.xml布局:--(作用:实现ListView的栏位布局) 3.建立Item. ...

  3. docker-5 docker仓库

    docker部署环境:CentOS release 6.5 (Final) Docker配置文件:/etc/sysconfig/docker  重要参数解释: -H 表示Docker Daemon绑定 ...

  4. Terminal中输入命令直接打开QtCreator,以及创建其桌面快捷方式

    工业项目设计学习第一步,熟悉开发工具 Qt学习论坛,东西多,但也杂 emouse的博客,以前学习STM32开发环境搭建时也是参考这位博主的 更多详细的步骤在上面都能找到,今天先不写,等明天把硬件设备全 ...

  5. Java实现点击一个Jlabel增加一个Jlabel的小功能

    当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...

  6. 翻译《Writing Idiomatic Python》(三):变量、字符串、列表

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  7. [No000022]他们说:得诺贝尔奖到底有多难?

  8. Eclipse调整双击选取的字符颜色背景

    Eclipse调整双击选取的字符颜色背景,如下图所示: 会有二点影响: 1. 编辑页的颜色 2. 右侧滚动条的小提示点的颜色.

  9. gzip: stdout: No space left on device问题的解决

    一.问题描述 最近安装了ubuntu14.04,并在ubuntu14.04中编译了一次内核.这之后大部分情况下用sudo apt-get install 安装应用都会出现“gzip: stdout: ...

  10. HTML 学习笔记(链接)

    HTML链接 超链接可以是一个字,一个词,或者一组词,也可以是一幅图像,您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分. 当您把鼠标指针移动到网页中的某个链接上时,箭头会变为一只小手. 我 ...