เมธอด 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 ทุกโหนด)