上一篇講了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再回傳!!
以上,就是三種用法的區別!!
看到很多範例都寫得好複雜阿~真心覺得既然是教函式用法
為何要寫得這麼複雜呢~?
自己寫了三種超簡單,也超無用的用法,幫助自己吸收!