การหาผลคูณของสมาชิกทั้งหมดใน List
วิธีที่ 1: foreach Loop (เข้าใจง่าย เร็วที่สุด)
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
var myList = new List { 5, 10, 7 };
int product = 1;
foreach (int n in myList)
{
product *= n;
}
Console.WriteLine($"Product: {product}"); // 350
}
}
วิธีที่ 2: LINQ Aggregate (Functional Style)
using System.Linq;
var product = myList.Aggregate(1, (acc, n) => acc * n);
// หรือ
var product = myList.Aggregate((acc, n) => acc * n); // ใช้ตัวแรกเป็น seed
วิธีที่ 3: สำหรับ double/decimal (หลีกเลี่ยง Overflow)
var numbers = new List { 1.5, 2.0, 3.5 };
double product = numbers.Aggregate(1.0, (acc, n) => acc * n);
จัดการ Empty List
public static int Product(List list)
{
if (list == null || list.Count == 0)
return 0; // หรือ throw / return 1 ตาม Business Logic
return list.Aggregate(1, (acc, n) => acc * n);
}
⚠️ Integer Overflow
int.MaxValue = 2,147,483,647 หากผลคูณเกินจะเกิด Overflow (Wrap around)
// ใช้ checked เพื่อ Throw Exception
checked
{
int product = list.Aggregate(1, (acc, n) => acc * n);
}
// หรือใช้ long/BigInteger
long product = list.Aggregate(1L, (acc, n) => acc * n);
BigInteger product = list.Aggregate(BigInteger.One, (acc, n) => acc * n);
Parallel Version (สำหรับ List ใหญ่มาก)
using System.Threading.Tasks;
var product = list.AsParallel().Aggregate(
() => 1, // Seed factory
(acc, n) => acc * n, // Local aggregation
(acc1, acc2) => acc1 * acc2, // Combine
acc => acc); // Final selector
กรณีใช้งานจริง
- คำนวณ Probability (คูณความน่าจะเป็นอิสระ)
- Financial: Compound Interest, Returns
- Statistics: Geometric Mean (nth root of product)
- Combinatorics: Permutations, Combinations
Benchmark สรุป
| วิธี | Speed | Readability | Overflow Safety |
|---|---|---|---|
| foreach Loop | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Manual |
| LINQ Aggregate | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Manual |
| Parallel Aggregate | ⭐⭐⭐ (Large N) | ⭐⭐ | Manual |