เมธอด Queue.Equals() ใน C# ใช้ตรวจสอบว่าออบเจ็กต์ Queue ตัวหนึ่งเท่ากับอีกตัวหนึ่งหรือไม่ โดยค่าเริ่มต้นจะเปรียบเทียบ Reference Equality (ชี้ไปยัง instance เดียวกัน) ไม่ใช่เปรียบเทียบเนื้อหา
รูปแบบไวยากรณ์ (Syntax)
public virtual bool Equals(object obj);
obj: ออบเจ็กต์ที่ต้องการเปรียบเทียบ- คืนค่า : true หากเป็น instance เดียวกัน, false หากไม่ใช่
ตัวอย่างที่ 1: เปรียบเทียบกับตัวเอง (Reference Equality)
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Queue queue = new Queue();
queue.Enqueue("Gary");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
queue.Enqueue("Mark");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
Console.WriteLine(queue.Equals(queue)); // True - instance เดียวกัน
Console.Write("Count = ");
Console.WriteLine(queue.Count);
queue.Clear();
Console.Write("Count after Clear = ");
Console.WriteLine(queue.Count);
}
}
ผลลัพธ์
True Count = 8 Count after Clear = 0
ตัวอย่างที่ 2: เปรียบเทียบคิวสองตัวที่มีเนื้อหาเหมือนกันแตกต่าง Instance
using System;
using System.Collections;
public class Demo
{
public static void Main()
{
Queue queue = new Queue();
queue.Enqueue(100);
queue.Enqueue(200);
queue.Enqueue(300);
queue.Enqueue(400);
Queue queue2 = new Queue();
queue2.Enqueue(100);
queue2.Enqueue(150); // ต่างกัน
queue2.Enqueue(300);
queue2.Enqueue(400);
Console.WriteLine(queue.Equals(queue2)); // False - instance ต่างกัน
}
}
ผลลัพธ์
False
สรุปและข้อสังเกตสำคัญ
⚠ Queue.Equals() เปรียบเทียบ Reference ไม่ใช่ Value
แม้สอง Queue จะมีสมาชิกเหมือนกันทุกตัว ลำดับเดียวกัน Equals() ก็ยังคืน False เพราะเป็น instance คนละตัว
แม้สอง Queue จะมีสมาชิกเหมือนกันทุกตัว ลำดับเดียวกัน Equals() ก็ยังคืน False เพราะเป็น instance คนละตัว
วิธีเปรียบเทียบเนื้อหา (Content Equality)
using System.Linq; Queueq1 = new Queue (new[] { 1, 2, 3 }); Queue q2 = new Queue (new[] { 1, 2, 3 }); // ใช้ SequenceEqual (ต้อง using System.Linq) bool equal = q1.SequenceEqual(q2); // True // หรือแปลงเป็น Array ก่อน bool equal2 = q1.ToArray().SequenceEqual(q2.ToArray()); // True
เมธอดอื่นๆ ที่เกี่ยวข้อง
ReferenceEquals(q1, q2): ตรวจสอบ reference identity โดยตรง (static method)Object.ReferenceEquals(): เหมือนกัน- Generic
Queue<T>ไม่ Override Equals() ใช้ของ Object (Reference Equality)
แนวทางปฏิบัติ
- อย่าใช้ Equals() เพื่อเช็คว่า Queue สองตัวมีข้อมูลเหมือนกัน
- ใช้
SequenceEqual()จาก LINQ แทน - หรือวนลูปเปรียบเทียบเองหากไม่ต้องการ LINQ