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
| คุณสมบัติ | Intersect | Join |
|---|---|---|
| ผลลัพธ์ | ค่าที่ซ้ำ (Distinct) | คู่ (Key, Value) - อาจซ้ำได้ |
| Key Selector | Element เอง | ระบุ Key Selector ได้ |
| Performance | HashSet 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()