iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 10
1
Modern Web

我的30天MVC從零到不知道多少學習筆記系列 第 10

從零開始的MVC開發-LinQ 看似複雜的Aggregate自訂運算

上一篇講了count() Any() Max()...基礎的運算
這次要寫的是自訂運算 Aggregate()
本來要連上篇一起寫的
但看到一半發現我真的看不太懂XD
花了一點時間想說要好好筆記一下 就獨立寫成一篇吧!

Aggragate() 這個函式看起來有點複雜,所以我決定要放上原型

public static TSource Aggregate<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, TSource, TSource> func
)
public static TAccumulate Aggregate<TSource, TAccumulate>(
	this IEnumerable<TSource> source,
	TAccumulate seed,
	Func<TAccumulate, TSource, TAccumulate> func
)
public static TResult Aggregate<TSource, TAccumulate, TResult>(
	this IEnumerable<TSource> source,
	TAccumulate seed,
	Func<TAccumulate, TSource, TAccumulate> func,
	Func<TAccumulate, TResult> resultSelector
)

放上原型之後就覺得更複雜了(扶額

沒關係~簡單來說~Aggragate會將資料依照你自訂的方式一筆一筆作運算
每做完一次會將結果暫存,並用這個結果跟下一筆繼續運算
他提供三種方式,其實都差不多的意思
第一種是不提供起始值(種子),就直接將你的資料內容第一筆當運算起始值,與第二筆開始做運算
第二種是提供一個起始值給他,會從這個起始值開始,與你的第一筆資料做運算
第三種跟第二種差不多,是在運算結束後,你可以修改傳回的值

我用超簡單範例來實作一下!!
第一種用法

int[] num={1,2,3,4,5,6,7,8,9,10};
int sum=num.Aggregate((start,next)=>{Console.WriteLine(start+next); 
                                     return start+next;});
Console.WriteLine("end:"+sum);
//3 6 10 15 21 28 36 45 55 end:55

其實就是從1加到10的意思!
沒有給起始值,所以他自動從第一個值開始,與第二個值相加
之後將回傳的值在當成起始值,與第三個值相加
一直反覆做到最後一個值!

第二種寫法

int[] num={1,2,3,4,5,6,7,8,9,10};
int sum=num.Aggregate(0,(start,next)=>{Console.WriteLine(start+next); 
                                     return start+next;});
Console.WriteLine("end:"+sum);
//1 3 6 10 15 21 28 36 45 55 end:55

第二種寫法加上了起始值,所以會從0+1開始運算

第三種寫法

int[] num={1,2,3,4,5,6,7,8,9,10};
int sum=num.Aggregate(0,(start,next)=>{Console.WriteLine(start+next); 
                                        return start+next;},
                      end=>end+100);
Console.WriteLine("end:"+sum);
//1 3 6 10 15 21 28 36 45 55 end:155

加上了修改運算結果,把運算結果加上100再回傳!!

以上,就是三種用法的區別!!
看到很多範例都寫得好複雜阿~真心覺得既然是教函式用法
為何要寫得這麼複雜呢~?
自己寫了三種超簡單,也超無用的用法,幫助自己吸收!


上一篇
從零開始的MVC開發-LinQ 聚合運算
下一篇
從零開始的MVC開發-Controller與View的對話
系列文
我的30天MVC從零到不知道多少學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言