Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Duyệt hai List/Array cùng lúc với một foreach trong C#

Sử dụng phương thức Zip() trong LINQ để kết hợp hai chuỗi (sequences) song song, sau đó duyệt bằng một vòng lặp foreach duy nhất.

Ví dụ: Kết hợp mảng int và string

var numbers = new[] { 20, 40, 60 };
var words = new[] { "ele1", "ele2", "ele3" };

var combined = numbers.Zip(words, (n, w) => new { Number = n, Word = w });

foreach (var item in combined)
    Console.WriteLine($"{item.Number}{item.Word}");
// 20ele1
// 40ele2
// 60ele3

Mã nguồn hoàn chỉnh

using System;
using System.Collections.Generic;
using System.Linq;

public class Demo
{
    public static void Main()
    {
        var val = new[] { 20, 40, 60 };
        var str = new[] { "ele1", "ele2", "ele3" };
        
        var res = val.Zip(str, (n, w) => new { Number = n, Word = w });
        
        foreach (var a in res)
            Console.WriteLine(a.Number + a.Word);
    }
}

Kết quả

20ele1
40ele2
60ele3

Zip Overloads

Ví dụ .NET 6+ (tuples)

// Trả về tuple tự động
var zipped = numbers.Zip(words);  // IEnumerable<(int, string)>
foreach (var (num, word) in zipped)
    Console.WriteLine($"{num}: {word}");

// Ba chuỗi
var z3 = first.Zip(second, third);  // IEnumerable<(T1, T2, T3)>

Lưu ý

  • Zip dừng khi một trong hai chuỗi hết phần tử (độ dài = min(len1, len2)).
  • Thực thi trì hoãn (deferred execution).
  • Khác với Join (SQL-style join theo key), Zip ghép theo vị trí (positional).

Cách thủ công (trước LINQ / không dùng Zip)

for (int i = 0; i < Math.Min(arr1.Length, arr2.Length); i++)
{
    Console.WriteLine(arr1[i] + " " + arr2[i]);
}
Phiên bảnCú phápGhi chú
C# 7.0+Zip(first, second, selector)3 tham số
.NET 6+ / C# 10+Zip(first, second, third)3 sequences, tuple result
.NET 6+Zip(first, second)Trả về tuple (TFirst, TSecond)