如果不知道MapReduce是怎麼工作的,請看這裡,如果不知道MapReduce是什麼,請google之!
今天“閒”來無事,忽想起C#裡沒有MapReduce的方法,構思之,coding之:
IEnumerable<T>.MapReduce Dictionary<TKey, TResult> MapReduce<TInput, TKey, TValue, TResult> IEnumerable<TInput><TInput, IEnumerable<KeyValuePair<TKey, TValue>>><TKey, IEnumerable<TValue>, TResult><TKey, List<TValue>> mapResult = Dictionary<TKey, List<TValue>> ( item ( one <TValue> (!mapResult.TryGetValue(one.Key, = List<TValue> result = Dictionary<TKey, TResult> ( m
注:由於在map方法裡可emit多次,所以這裡返回IEnumerable,下文例子中可以看到用yield return來實現。
例:
ID { ; Name { ; Age { ;
Main(<Person> list= List<Person> Person { ID=, Name=, Age= Person { ID = , Name = , Age = Person { ID = , Name = , Age = Person { ID = , Name = , Age = Person { ID = , Name = , Age = result = list.MapReduce<Person, , , >=> .Join( ( d + + IEnumerable<KeyValuePair<, >> (p.Age > KeyValuePair<, >
上面程序所做的事為統計年齡大於22的,各個年齡都有誰,顯示如:
23:user1,user3(嫌上傳圖片太麻煩,弄了個html版控制台,見諒!)
肯定有人會問為什麼map不像reduce方法一樣用lambda表達式,因為yield return不能在匿名方法和lambda表達式中!MS表示已知道這個問題,但重寫yield花費很大,將來肯定會解決!