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

เมธอด Union ใน C# (LINQ) - รวมรายการแบบไม่ซ้ำกัน

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