เมธอด 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 - เปรียบเทียบ
| คุณสมบัติ | ArrayList | List<T> |
|---|---|---|
| Equals() | Reference | Reference |
| Value Comparison | Manual / LINQ | SequenceEqual (LINQ) |
| Type Safety | ไม่มี (object) | มี (Generic) |
| Performance | Boxing/Unboxing | ไม่มี Boxing |
| Capacity | มี | มี |