文章目錄
- Aggregate(Count)
- 彙總(計數)
- Aggregate(Sum)
- 彙總(求和)
- Aggregate(Min)
- 彙總(求最小值)
- Aggregate(Max)
- 彙總(求最大值)
- Aggregate(Average)
- 彙總(求平均值)
- Aggregate(Simple)
- 簡單彙總
- Aggregate(Seed)
- 帶種子的彙總
Aggregate(Count)彙總(計數)
- 計數操作用於統計原創組合中符合某種條件的成員的個數,結果值為整數。
計數操作在各語言中的實現方式如下表所示:
| |
Count |
| SQL(SELECT) |
COUNT函數 |
| C#(LINQ) |
Count擴充方法 |
| F#(List) |
由List.filter和List.Length函數聯合實現 |
| C++(STL) |
count, count_if等演算法函數 |
| Haskell(Prelude) |
由filter和length函數聯合實現 |
以下範例程式碼功能為:統計整形集合numbers中奇數成員的個數。
- SQL(SELECT)
TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT COUNT(*) AS ODDNUMBERS INTO RESULT FROM NUMBERS WHERE NUM MOD 2 = 1</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />ODDNUMBERS 5
- C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int oddNumbers = numbers.Count(n => n % 2 == 1);<br />// oddNumbers = 5
- F#(List)
let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let oddNumbers = numbers |> List.filter (fun num -> num % 2 = 1) |> List.length<br />// oddNumbers = 5
- STL(C++)
int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int oddNumbers = count_if(numbers, numbers + 10,<br />[](int num){return num % 2 == 1;});<br />// oddNumbers = 5
- Haskell(Prelude)
Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let count f = length . filter f<br />Prelude> let oddNumbers = count (/n -> n `mod` 2 == 1) numbers<br />Prelude> oddNumbers<br />5
Aggregate(Sum)彙總(求和)
- 求和操作用於計算原創組合中各成員的總和,結果類型與原創組合成員類型相同。
求和操作在各語言中的實現方式如下表所示:
| |
Sum |
| SQL(SELECT) |
SUM函數 |
| C#(LINQ) |
Sum擴充方法 |
| F#(List) |
List.sum, List.sumBy等函數 |
| C++(STL) |
accumulate演算法函數 |
| Haskell(Prelude) |
sum函數 |
以下範例程式碼功能為:計算整形集合numbers中各成員的總和。
- SQL(SELECT)
TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT SUM(NUM) AS NUMSUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />NUMSUM 45
- C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />double numSum = numbers.Sum();<br />// numSum = 45
- F#(List)
let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let numSum = List.sum numbers<br />// numSum = 45
- STL(C++)
int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int numSum = accumulate(numbers, numbers + 10, 0,<br />[](int acc, int num){return acc + num;});<br />// numSum = 45
- Haskell(Prelude)
Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let numSum = sum numbers<br />Prelude> numSum<br />45
Aggregate(Min)彙總(求最小值)
- 求最小值操作用於找出原創組合中最小的成員,結果類型與原創組合成員類型相同。
求最小值操作在各語言中的實現方式如下表所示:
| |
Min |
| SQL(SELECT) |
MIN函數 |
| C#(LINQ) |
Min擴充方法 |
| F#(List) |
List.min, List.minBy等函數 |
| C++(STL) |
min_element演算法函數 |
| Haskell(Prelude) |
minimum, minimumBy等函數 |
以下範例程式碼功能為:找出整形集合numbers中最小的成員。
- SQL(SELECT)
TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT MIN(NUM) AS MINNUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />MINNUM 0
- C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int minNum = numbers.Min();<br />// minNum = 0
- F#(List)
let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let minNum = List.min numbers<br />// minNum = 0
- STL(C++)
int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int minNum = *min_element(numbers, numbers + 10);<br />// minNum = 0
- Haskell(Prelude)
Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let minNum = minimum numbers<br />Prelude> minNum<br />0
Aggregate(Max)彙總(求最大值)
- 求最大值操作用於找出原創組合中最大的成員,結果類型與原創組合成員類型相同。
求最大值操作在各語言中的實現方式如下表所示:
| |
Max |
| SQL(SELECT) |
MAX函數 |
| C#(LINQ) |
Max擴充方法 |
| F#(List) |
List.max, List.maxBy等函數 |
| C++(STL) |
max_element演算法函數 |
| Haskell(Prelude) |
maximum, maximumBy等函數 |
以下範例程式碼功能為:找出整形集合numbers中最大的成員。
- SQL(SELECT)
TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT MAX(NUM) AS MAXNUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />MAXNUM 9
- C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int maxNum = numbers.Max();<br />// maxNum = 9
- F#(List)
let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let maxNum = List.max numbers<br />// maxNum = 9
- STL(C++)
int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int maxNum = *max_element(numbers, numbers + 10);<br />// maxNum = 9
- Haskell(Prelude)
Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let maxNum = maximum numbers<br />Prelude> maxNum<br />9
Aggregate(Average)彙總(求平均值)
- 求平均值操作用於計算原創組合中各成員的平均值,結果類型與原創組合成員類型相同。
求平均值操作在各語言中的實現方式如下表所示:
| |
Average |
| SQL(SELECT) |
AVG函數 |
| C#(LINQ) |
Average擴充方法 |
| F#(List) |
List.average, List.averageBy等函數 |
| C++(STL) |
無對應演算法函數,由accumulate演算法函數間接實現 |
| Haskell(Prelude) |
由sum和length函數聯合實現 |
以下範例程式碼功能為:計算整形集合numbers中各成員的平均值。
- SQL(SELECT)
TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT AVG(NUM) AS AVERAGENUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />AVERAGENUM 4.5
- C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />double averageNum = numbers.Average();<br />// averageNum = 4.5
- F#(List)
let numbers = [5.; 4.; 1.; 3.; 9.; 8.; 6.; 7.; 2.; 0.]<br />let averageNum = List.average numbers<br />// averageNum = 4.5
- STL(C++)
int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />double averageNum = accumulate(numbers, numbers + 10, 0,<br />[](int acc, int num){return acc + num;}) / 10.;<br />// averageNum = 4.5
- Haskell(Prelude)
Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let averageNum = fromIntegral (sum numbers) / fromIntegral (length numbers)<br />Prelude> averageNum<br />4.5
Aggregate(Simple)簡單彙總
- 簡單彙總操作。
簡單彙總操作在各語言中的實現方式如下表所示:
| |
Aggregate(Simple) |
| SQL(SELECT) |
無對應函數 |
| C#(LINQ) |
Aggregate擴充方法 |
| F#(List) |
List.reduce, List.reduceBack等函數 |
| C++(STL) |
accumulate演算法函數 |
| Haskell(Prelude) |
foldl1, foldr1等函數 |
以下範例程式碼功能為:計算雙精確度浮點數集合doubles中所有成員的積。
- SQL(SELECT)
- C#(LINQ)double[] doubles = {1.7, 2.3, 1.9, 4.1, 2.9};<br />double product = doubles.Aggregate((runningProduct, nextFactor) => runningProduct * nextFactor);<br />// product = 88.330809999999985
- F#(List)
let doubles = [1.7; 2.3; 1.9; 4.1; 2.9]<br />let product = List.reduce (fun runningProduct nextFactor -> runningProduct * nextFactor) doubles<br />// product = 88.33081
- C++(STL)
double doubles[] = {1.7, 2.3, 1.9, 4.1, 2.9};<br />double product = accumulate(doubles + 1, doubles + 5, doubles[0],<br />[](double runningProduct, double nextFactor){return runningProduct * nextFactor;});<br />// product = 88.330809999999985
- Haskell(Prelude)
Prelude> let doubles = [1.7, 2.3, 1.9, 4.1, 2.9]<br />Prelude> let productOfDoubles = foldl1 (/runningProduct nextFactor -> runningProduct * nextFactor) doubles<br />Prelude> productOfDoubles<br />88.33080999999999
Aggregate(Seed)帶種子的彙總
- 帶種子的彙總操作。
帶種子的彙總操作在各語言中的實現方式如下表所示:
| |
Aggregate(Simple) |
| SQL(SELECT) |
無對應函數 |
| C#(LINQ) |
Aggregate擴充方法 |
| F#(List) |
List.fold, List.foldBack等函數 |
| C++(STL) |
accumulate演算法函數 |
| Haskell(Prelude) |
foldl, foldr等函數 |
以下範例程式碼功能為:從賬戶中扣除提款額(忽略大於存款的提款項目),計算賬戶餘額。
- SQL(SELECT)
- C#(LINQ)double startBalance = 100.0;<br />int[] attemptedWithdrawals = { 20, 10, 40, 50, 10, 70, 30 };<br />double endBalance =<br /> attemptedWithdrawals.Aggregate(startBalance,<br /> (balance, nextWithdrawal) =><br /> ((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance));<br />// endBalance = 20.0
- F#(List)
let startBalance = 100.0<br />let attemptedWithdrawals = [20; 10; 40; 50; 10; 70; 30]<br />let endBalance = List.fold (fun balance nextWithdrawal2 -><br /> let nextWithdrawal = float nextWithdrawal2<br /> if nextWithdrawal <= balance then balance - nextWithdrawal<br /> else balance) startBalance attemptedWithdrawals<br />// endBalance = 20.0
- C++(STL)
double startBalance = 100.0;<br />int attemptedWithdrawals[] = {20, 10, 40, 50, 10, 70, 30};<br />double endBalance = accumulate(attemptedWithdrawals, attemptedWithdrawals + 7,<br />startBalance, [](double balance, int nextWithdrawal){<br />return ((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance);});<br />// endBalance = 20.000000000000000
- Haskell(Prelude)
Prelude> let startBalance = 100.0<br />Prelude> let attemptedWithdrawals = [20, 10, 40, 50, 10, 70, 30]<br />Prelude> let endBalance = foldl (/ balance nextWithdrawal2 -> let nextWithdrawal = fromIntegral nextWithdrawal2 in if nextWithdrawal <= balance then balance - nextWithdrawal else balance) startBalance attemptedWithdrawals<br />Prelude> endBalance<br />20.0