Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Loop ผ่านอาร์เรย์ใน C# - for, foreach, Span

การ 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

MethodSpeedAllocationUse Case
for Loop⭐⭐⭐⭐⭐NoneIndex Needed, Max Perf
foreach⭐⭐⭐⭐Enumerator (Struct - Minimal)General Purpose
Array.ForEach⭐⭐⭐⭐DelegateFunctional Style
LINQ⭐⭐⭐Iterators, ClosuresQuery/Transform
Span<T>⭐⭐⭐⭐⭐None (Stack)High Perf, Slicing, Interop
Parallel.ForEach⭐⭐⭐ (Overhead)TasksCPU-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);