การ Iterate อาร์เรย์ใน C# มีหลายวิธี เลือกตาม Use Case
1. for Loop (Index-based) - ควบคุม Index ได้
int[] arr = { 34, 56, 12 };
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine($"Index {i}: {arr[i]}");
}
// Reverse
for (int i = arr.Length - 1; i >= 0; i--)
{
Console.WriteLine(arr[i]);
}
// Step 2
for (int i = 0; i < arr.Length; i += 2)
{
Console.WriteLine(arr[i]);
}
2. foreach (Read-only Iteration) - สะดวกที่สุด
int[] arr = { 34, 56, 12 };
foreach (int item in arr)
{
Console.WriteLine(item);
// item = 100; // Error: Iteration Variable Read-only
}
3. Array.ForEach (Method Syntax)
Array.ForEach(arr, item => Console.WriteLine(item));
// With Index (Manual)
Array.ForEach(arr, (item, index) => Console.WriteLine($"{index}: {item}")); // C# 10+ Tuple
// หรือ
for (int i = 0; i < arr.Length; i++)
Console.WriteLine($"{i}: {arr[i]}");
4. LINQ (Deferred, Query Syntax)
using System.Linq;
var doubled = arr.Select(x => x * 2).ToArray();
var filtered = arr.Where(x => x > 20).ToArray();
var indexed = arr.Select((value, index) => new { index, value });
5. Span<T> / Memory<T> (High Performance, .NET Core 2.1+)
// Stack-allocated (No Heap Allocation)
Span span = stackalloc int[5] { 1, 2, 3, 4, 5 };
foreach (int item in span)
Console.WriteLine(item);
// Slice (Sub-array without Copy)
Span slice = span.Slice(1, 3); // {2, 3, 4}
// ReadOnlySpan for Read-Only
ReadOnlySpan roSpan = arr;
foreach (int item in roSpan) { }
6. Parallel.ForEach (Multi-threaded)
using System.Threading.Tasks;
Parallel.ForEach(arr, item =>
{
// Thread-safe operations only
ProcessItem(item);
});
// With Options
Parallel.ForEach(arr, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item =>
{
ProcessItem(item);
});
Performance Comparison
| Method | Speed | Allocation | Use Case |
|---|---|---|---|
| for Loop | ⭐⭐⭐⭐⭐ | None | Index Needed, Max Perf |
| foreach | ⭐⭐⭐⭐ | Enumerator (Struct - Minimal) | General Purpose |
| Array.ForEach | ⭐⭐⭐⭐ | Delegate | Functional Style |
| LINQ | ⭐⭐⭐ | Iterators, Closures | Query/Transform |
| Span<T> | ⭐⭐⭐⭐⭐ | None (Stack) | High Perf, Slicing, Interop |
| Parallel.ForEach | ⭐⭐⭐ (Overhead) | Tasks | CPU-Bound, Large Arrays |
Multidimensional Array
int[,] matrix = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
// Nested For
for (int i = 0; i < matrix.GetLength(0); i++)
for (int j = 0; j < matrix.GetLength(1); j++)
Console.WriteLine(matrix[i, j]);
// Flatten với foreach
foreach (int item in matrix)
Console.WriteLine(item); // Row-major Order
Jagged Array
int[][] jagged = { new[] { 1, 2 }, new[] { 3, 4, 5 } };
foreach (var row in jagged)
foreach (var item in row)
Console.WriteLine(item);