Enumerable.Union() เป็น Extension Method ใน LINQ สำหรับรวมสอง Sequence ให้ได้ค่าที่ไม่ซ้ำกัน (Set Union) โดยคืนค่า Sequence ใหม่ ไม่เปลี่ยนแปลงต้นทาง
ลายเซ็น
public static IEnumerable<TSource> Union<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
IEqualityComparer<TSource> comparer = null);
ตัวอย่างพื้นฐาน
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo
{
public static void Main()
{
var list1 = new List { 12, 65, 88, 45 };
var list2 = new List { 40, 34, 65 }; // 65 ซ้ำ
var union = list1.Union(list2);
Console.WriteLine("Union Result:");
foreach (int n in union)
Console.WriteLine(n);
}
}
ผลลัพธ์
12
65
88
45
40
34
ลำดับของผลลัพธ์
Union() จะรักษาลำดับ: ทุกค่าจาก Sequence แรกตามลำดับเดิม ตามด้วย ค่าจาก Sequence ที่สองที่ไม่ซ้ำกับ Sequence แรก ตามลำดับที่ปรากฏ
การใช้ Custom Comparer
// เปรียบเทียบ String แบบ Case-Insensitive
var names1 = new[] { "Alice", "Bob", "CHARLIE" };
var names2 = new[] { "bob", "David", "alice" };
var union = names1.Union(names2, StringComparer.OrdinalIgnoreCase);
// ผลลัพธ์: Alice, Bob, CHARLIE, David
Union หลายรายการ (Chaining)
var result = list1
.Union(list2)
.Union(list3)
.Union(list4);
เปรียบเทียบกับ HashSet.UnionWith()
- Union(): Functional Style, Immutable, Deferred Execution, ใช้กับ IEnumerable ทุกชนิด
- UnionWith(): Imperative Style, Mutable, Immediate, เฉพาะ HashSet
เมื่อไหร่ควรใช้ Union()
- ต้องการรักษาข้อมูลต้นทาง
- ทำงานกับ List, Array, หรือ IEnumerable ทั่วไป
- ต้องการ Deferred Execution (คำนวณตอน Enumerate)
- ต้องการ Custom Equality Comparer