ภาพรวม
การหา Intersection (ส่วนที่ซ้อนทับ/ร่วมกัน) ของสอง List ใน C# สามารถทำได้ง่ายด้วยเมธอด Intersect() จาก LINQ (System.Linq) เมธอดนี้คืนค่า IEnumerable ที่มีเฉพาะองค์ประกอบที่ปรากฏใน ทั้งสอง List (Distinct - ไม่ซ้ำ)
ตัวอย่างโปรแกรม
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
public class Program
{
public static void Main(string[] args)
{
// List แรก
List list1 = new List { 2, 3, 5, 7 };
Console.WriteLine("List 1 จำนวน: " + list1.Count);
// List ที่สอง
List list2 = new List { 5, 4, 6, 8 };
Console.WriteLine("List 2 จำนวน: " + list2.Count);
// หา Intersection (ค่าที่อยู่ในทั้งสอง List)
List common = list1.Intersect(list2).ToList();
Console.WriteLine("Intersection จำนวน: " + common.Count);
Console.WriteLine("ค่าที่ซ้ำกัน: " + string.Join(", ", common));
}
}
} ผลลัพธ์
List 1 จำนวน: 4 List 2 จำนวน: 4 Intersection จำนวน: 1 ค่าที่ซ้ำกัน: 5
คำอธิบาย
- List 1: {2, 3, 5, 7}
- List 2: {5, 4, 6, 8}
- ค่าที่อยู่ในทั้งสอง: {5} (เพียงค่าเดียว)
Intersect()คืนค่า Distinct (ไม่ซ้ำ) โดยอัตโนมัติ
เมธอด LINQ ที่เกี่ยวข้อง
| เมธอด | คำอธิบาย | ตัวอย่างผลลัพธ์ |
|---|---|---|
Intersect | ค่าที่อยู่ในทั้งสอง (AND) | {5} |
Union | ค่าที่อยู่ในอย่างน้อยหนึ่ง (OR) - ไม่ซ้ำ | {2,3,4,5,6,7,8} |
Except | ค่าที่อยู่ในตัวแรกแต่ไม่อยู่ในตัวที่สอง | {2,3,7} |
Concat | ต่อสอง List เข้าด้วยกัน (อาจซ้ำ) | {2,3,5,7,5,4,6,8} |
ตัวอย่างเพิ่มเติม: Intersect กับ Object/Class
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
// ต้อง Override Equals/GetHashCode หรือใช้ IEqualityComparer
public override bool Equals(object obj) => obj is Person p && p.Id == Id;
public override int GetHashCode() => Id.GetHashCode();
}
var list1 = new List { new Person { Id = 1, Name = "A" }, new Person { Id = 2, Name = "B" } };
var list2 = new List { new Person { Id = 2, Name = "B2" }, new Person { Id = 3, Name = "C" } };
var common = list1.Intersect(list2).ToList(); // ได้ Person Id=2 ข้อสังเกตสำคัญ
Intersect()ใช้ Set Semantics - ผลลัพธ์ไม่มีค่าซ้ำ (Distinct)- สำหรับ Reference Type ต้อง Implement
IEquatable<T>หรือIEqualityComparer<T>หรือ OverrideEquals/GetHashCode - ประสิทธิภาพ: O(n + m) โดยใช้ HashSet ภายใน
- หากต้องการรักษาค่าซ้ำ (Multiset Intersection) ต้องเขียนเองหรือใช้ Library