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

ตรวจสอบว่า LinkedList สองออบเจ็กต์เท่ากันใน C#

เมธอด Equals(object) ของ LinkedList<T> **ไม่ได้ Override** จาก Object ดังนั้นจึงเปรียบเทียบ **Reference Equality** (อ้างอิงออบเจ็กต์เดียวกัน) ไม่ใช่เปรียบเทียบเนื้อหา

ตัวอย่างที่ 1: ออบเจ็กต์ต่างกัน แต่มีเนื้อหาเหมือนกัน -> False

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main(string[] args)
    {
        LinkedList<string> list1 = new LinkedList<string>();
        list1.AddLast("One");
        list1.AddLast("Two");
        list1.AddLast("Three");
        list1.AddLast("Four");
        list1.AddLast("Five");

        Console.WriteLine("องค์ประกอบใน LinkedList1...");
        foreach (string res in list1)
        {
            Console.WriteLine(res);
        }

        LinkedList<string> list2 = new LinkedList<string>();
        list2.AddLast("India");
        list2.AddLast("US");
        list2.AddLast("UK");
        list2.AddLast("Canada");
        list2.AddLast("Poland");
        list2.AddLast("Netherlands");

        Console.WriteLine("องค์ประกอบใน LinkedList2...");
        foreach (string res in list2)
        {
            Console.WriteLine(res);
        }

        // list3 อ้างอิงไปที่ list2 เดียวกัน
        LinkedList<string> list3 = list2;
        Console.WriteLine("LinkedList3 เท่ากับ LinkedList2? = " + list3.Equals(list2)); // True (Same Reference)
    }
}

ผลลัพธ์

องค์ประกอบใน LinkedList1...
One
Two
Three
Four
Five
องค์ประกอบใน LinkedList2...
India
US
UK
Canada
Poland
Netherlands
LinkedList3 เท่ากับ LinkedList2? = True

ตัวอย่างที่ 2: เนื้อหาเหมือนกันแต่ออบเจ็กต์ต่างกัน -> False

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main(string[] args)
    {
        LinkedList<string> list1 = new LinkedList<string>();
        list1.AddLast("One");
        list1.AddLast("Two");
        list1.AddLast("Three");
        list1.AddLast("Four");
        list1.AddLast("Five");

        Console.WriteLine("องค์ประกอบใน LinkedList1...");
        foreach (string res in list1)
        {
            Console.WriteLine(res);
        }

        LinkedList<string> list2 = new LinkedList<string>();
        list2.AddLast("India");
        list2.AddLast("US");
        list2.AddLast("UK");
        list2.AddLast("Canada");
        list2.AddLast("Poland");
        list2.AddLast("Netherlands");

        Console.WriteLine("องค์ประกอบใน LinkedList2...");
        foreach (string res in list2)
        {
            Console.WriteLine(res);
        }

        // เปรียบเทียบ list2 กับ list1 (คนละออบเจ็กต์ เนื้อหาต่างกัน)
        Console.WriteLine("LinkedList2 เท่ากับ LinkedList1? = " + list2.Equals(list1)); // False
    }
}

ผลลัพธ์

องค์ประกอบใน LinkedList1...
One
Two
Three
Four
Five
องค์ประกอบใน LinkedList2...
India
US
UK
Canada
Poland
Netherlands
LinkedList2 เท่ากับ LinkedList1? = False

วิธีเปรียบเทียบเนื้อหา LinkedList (Value Equality)

// 1. ใช้ SequenceEqual (LINQ) - แนะนำ
bool equal = list1.SequenceEqual(list2);

// 2. เขียนเอง (Manual Comparison)
public static bool ContentEquals<T>(LinkedList<T> a, LinkedList<T> b)
{
    if (ReferenceEquals(a, b)) return true;
    if (a is null || b is null) return false;
    if (a.Count != b.Count) return false;
    
    var nodeA = a.First;
    var nodeB = b.First;
    while (nodeA != null)
    {
        if (!EqualityComparer<T>.Default.Equals(nodeA.Value, nodeB.Value))
            return false;
        nodeA = nodeA.Next;
        nodeB = nodeB.Next;
    }
    return true;
}

// 3. แปลงเป็น Array/List แล้วเปรียบเทียบ
bool equal = list1.ToArray().SequenceEqual(list2.ToArray());

LinkedList<T> คุณสมบัติหลัก

คุณสมบัติ/เมธอดคำอธิบายComplexity
AddFirst/Lastเพิ่มที่หัว/ท้ายO(1)
RemoveFirst/Lastลบที่หัว/ท้ายO(1)
AddBefore/After(node, value)เพิ่มก่อน/หลังโหนดที่ระบุO(1)
Remove(node) / Remove(value)ลบโหนด/ค่าO(1) / O(n)
Find(value)หาโหนดแรกที่มีค่าO(n)
CountจำนวนโหนดO(1)

ข้อสังเกตสำคัญ

  • LinkedList.Equals = Reference Equality เท่านั้น (ไม่เปรียบเทียบเนื้อหา)
  • ต้องใช้ SequenceEqual (LINQ) หรือเขียนเองสำหรับ Value Comparison
  • LinkedList เป็น Doubly Linked List - เหมาะสำหรับ Insert/Remove ที่กลางบ่อย
  • ไม่รองรับ Indexer (list[0]) - ต้องวนลูปหรือใช้ First/Last
  • Memory Overhead สูงกว่า List (มี Pointer Next/Prev ทุกโหนด)