Enumerable.Concat() ใช้ต่อ Sequence สองชุดเข้าด้วยกัน โดยไม่ตัดค่าซ้ำ (แตกต่างจาก Union) คืนค่า Sequence ใหม่แบบ Deferred Execution
ลายเซ็น
public static IEnumerable<TSource> Concat<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second);
ตัวอย่างพื้นฐาน
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo
{
public static void Main()
{
var list1 = new List { 12, 40 };
var list2 = new List { 98, 122, 199, 230 };
var concatenated = list1.Concat(list2);
foreach (int n in concatenated)
Console.WriteLine(n);
}
}
ผลลัพธ์
12
40
98
122
199
230
คุณสมบัติสำคัญ
- ไม่ตัดซ้ำ: ค่าที่ซ้ำกันจะปรากฏทั้งคู่
- รักษาลำดับ: รายการแรกทั้งหมด ตามด้วยรายการที่สองทั้งหมด
- Deferred Execution: ไม่คำนวณจนกว่าจะ Enumerate (foreach, ToList(), etc.)
- Streaming: ใช้หน่วยความจำคงที่ ไม่โหลดทั้งหมดเข้ามีอรี่
Concat หลายรายการ
var all = list1.Concat(list2).Concat(list3).Concat(list4);
// หรือใช้ SelectMany สำหรับหลายลิสต์
var lists = new[] { list1, list2, list3, list4 };
var all = lists.SelectMany(x => x);
Concat กับ Array
int[] arr1 = { 1, 2 };
int[] arr2 = { 3, 4 };
var result = arr1.Concat(arr2).ToArray(); // {1, 2, 3, 4}
เปรียบเทียบ Concat vs Union vs AddRange
| เมธอด | ตัดซ้ำ | แก้ไขต้นทาง | Deferred | ใช้กับ |
|---|---|---|---|---|
| Concat() | ไม่ | ไม่ | ใช่ | IEnumerable<T> |
| Union() | ใช่ | ไม่ | ใช่ | IEnumerable<T> |
| List.AddRange() | ไม่ | ใช่ | ไม่ | List<T> เท่านั้น |
กรณีใช้งานจริง
- รวมผลลัพธ์จาก Query หลายอัน (Union All ใน SQL)
- สร้าง Pipeline ประมวลผลข้อมูลแบบ Streaming
- ต่อ Header + Body + Footer ของรายงาน
- รวมข้อมูลจากหลายแหล่ง (Multiple Data Sources)