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

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

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

ตัวอย่างที่ 1: ออบเจ็กต์เดียวกัน (Reference) -> True

using System;
using System.Collections;

public class Demo
{
    public static void Main(string[] args)
    {
        ArrayList list1 = new ArrayList();
        list1.Add("A");
        list1.Add("B");
        list1.Add("C");
        list1.Add("D");
        list1.Add("E");
        list1.Add("F");
        list1.Add("G");
        list1.Add("H");
        list1.Add("I");

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

        ArrayList list2 = new ArrayList();
        list2.Add("A");
        list2.Add("B");
        list2.Add("C");
        list2.Add("D");
        list2.Add("E");
        list2.Add("F");
        list2.Add("G");
        list2.Add("H");
        list2.Add("I");

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

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

ผลลัพธ์

องค์ประกอบใน ArrayList1...
A
B
C
D
E
F
G
H
I
องค์ประกอบใน ArrayList2...
A
B
C
D
E
F
G
H
I
ArrayList3 เท่ากับ ArrayList2? = True

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

using System;
using System.Collections;

public class Demo
{
    public static void Main(string[] args)
    {
        ArrayList list1 = new ArrayList();
        list1.Add("A");
        list1.Add("B");
        list1.Add("C");
        list1.Add("D");
        list1.Add("E");
        list1.Add("F");
        list1.Add("G");
        list1.Add("H");
        list1.Add("I");

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

        ArrayList list2 = new ArrayList();
        list2.Add("A");
        list2.Add("B");
        list2.Add("C");
        list2.Add("D");
        list2.Add("E");
        list2.Add("F");
        list2.Add("G");
        list2.Add("H");
        list2.Add("I");

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

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

ผลลัพธ์

องค์ประกอบใน ArrayList1...
A
B
C
D
E
F
G
H
I
องค์ประกอบใน ArrayList2...
A
B
C
D
E
F
G
H
I
ArrayList1 เท่ากับ ArrayList2? = False

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

// 1. ใช้ SequenceEqual (LINQ) - แนะนำ
using System.Linq;
bool equal = list1.Cast<string>().SequenceEqual(list2.Cast<string>());

// 2. Manual Comparison
bool EqualArrayLists(ArrayList a, ArrayList b)
{
    if (ReferenceEquals(a, b)) return true;
    if (a is null || b is null) return false;
    if (a.Count != b.Count) return false;
    for (int i = 0; i < a.Count; i++)
    {
        if (!Equals(a[i], b[i])) return false;
    }
    return true;
}

// 3. แปลงเป็น List<T> ก่อน (แนะนำสำหรับโค้ดใหม่)
var genericList1 = new List<string>(list1.Cast<string>());
var genericList2 = new List<string>(list2.Cast<string>());
bool equal = genericList1.SequenceEqual(genericList2);

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

  • ArrayList.Equals = Reference Equality เท่านั้น
  • ไม่มี Built-in Value Comparison
  • ต้องใช้ SequenceEqual (LINQ) หรือเขียนเอง
  • ArrayList เป็น Non-Generic Legacy Class **แนะนำใช้ List<T> แทน**
  • List<T> ก็ยังใช้ Reference Equality สำหรับ Equals แต่มี SequenceEqual ใช้ง่าย

List<T> vs ArrayList - เปรียบเทียบ

คุณสมบัติArrayListList<T>
Equals()ReferenceReference
Value ComparisonManual / LINQSequenceEqual (LINQ)
Type Safetyไม่มี (object)มี (Generic)
PerformanceBoxing/Unboxingไม่มี Boxing
Capacityมีมี