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

เมธอด Intersect ใน C# (LINQ) - หาค่าร่วมระหว่างลิสต์

Enumerable.Intersect() คืนค่า Set Intersection ของสอง Sequence - คือค่าที่ปรากฏใน ทั้งคู่ โดยไม่ซ้ำ และเรียงตามลำดับของ Sequence แรก

ตัวอย่างพื้นฐาน

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

public class Demo
{
    public static void Main()
    {
        var list1 = new List { 99, 87 };
        var list2 = new List { 56, 87, 45, 99 };

        var common = list1.Intersect(list2);

        Console.WriteLine("Common elements:");
        foreach (int n in common)
            Console.WriteLine(n);
    }
}

ผลลัพธ์

99
87

Intersect กับ String (Case-Insensitive)

var list1 = new List { "Apple", "Banana", "Cherry" };
var list2 = new List { "banana", "DATE", "apple" };

var common = list1.Intersect(list2, StringComparer.OrdinalIgnoreCase);
// ผลลัพธ์: "Apple", "Banana" (เก็บค่าจาก list1)

Intersect กับ Object ต้องใช้ IEqualityComparer

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class PersonIdComparer : IEqualityComparer
{
    public bool Equals(Person x, Person y) => x?.Id == y?.Id;
    public int GetHashCode(Person obj) => obj?.Id.GetHashCode() ?? 0;
}

var common = people1.Intersect(people2, new PersonIdComparer());

Intersect หลายลิสต์ (Chaining)

var common = list1
    .Intersect(list2)
    .Intersect(list3)
    .Intersect(list4);

Intersect vs Join

คุณสมบัติIntersectJoin
ผลลัพธ์ค่าที่ซ้ำ (Distinct)คู่ (Key, Value) - อาจซ้ำได้
Key SelectorElement เองระบุ Key Selector ได้
PerformanceHashSet O(n+m)HashSet O(n+m)

กรณีใช้งานจริง

  • หา Common Tags ระหว่าง Articles
  • หา Shared Friends ระหว่าง Users
  • Permission Validation: User Permissions ∩ Required Permissions
  • Data Quality: หา ID ที่มีในทั้ง Source และ Target

⚠️ หมายเหตุ

Intersect() ใช้ Deferred Execution - Query จะรันตอน Enumerate (foreach, ToList, Count...) หากต้องการรันทันที ให้ใช้ .ToList() หรือ .ToArray()