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

เมธอด Queue.Equals() ใน C# : เปรียบเทียบคิวสองตัว

เมธอด 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 คนละตัว

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

using System.Linq;

Queue q1 = 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