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

โปรแกรมหา Intersection ของสอง List ใน C#

ภาพรวม

การหา 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> หรือ Override Equals/GetHashCode
  • ประสิทธิภาพ: O(n + m) โดยใช้ HashSet ภายใน
  • หากต้องการรักษาค่าซ้ำ (Multiset Intersection) ต้องเขียนเองหรือใช้ Library