บทความนี้สาธิตวิธีตรวจสอบว่าอาเรย์ (array) สองอันเท่ากันหรือไม่ โดยใช้เมธอด Equals() ใน C# — พร้อมอธิบายความแตกต่างระหว่าง reference equality และ value equality
ตัวอย่างที่ 1: อาเรย์สตริงที่ต่างกัน — Equals คืนค่า false
using System;
public class Demo
{
public static void Main()
{
String[] strArr1 = new String[3] { "John", "Jacob", "Tim" };
String[] strArr2 = new String[3] { "Tom", "Brad", "Bradley" };
Console.WriteLine("First String array...");
foreach (string val in strArr1)
{
Console.WriteLine(val);
}
Console.WriteLine("Second String array...");
foreach (string val in strArr2)
{
Console.WriteLine(val);
}
Console.WriteLine("Are both the array objects equal? = " + strArr1.Equals(strArr2));
}
}
ผลลัพธ์
First String array... John Jacob Tim Second String array... Tom Brad Bradley Are both the array objects equal? = False
ตัวอย่างที่ 2: อาเรย์จำนวนเต็ม — กำหนดให้อ้างอิงเดียวกัน
using System;
public class Demo
{
public static void Main()
{
int[] arr1 = new int[5] { 10, 20, 30, 40, 50 };
int[] arr2 = new int[5] { 25, 25, 40, 55, 70 };
Console.WriteLine("First integer array...");
foreach (int val in arr1)
{
Console.WriteLine(val);
}
Console.WriteLine("Second integer array...");
foreach (int val in arr2)
{
Console.WriteLine(val);
}
arr1 = arr2; // ทำให้ arr1 และ arr2 ชี้ไปยังออบเจ็กต์เดียวกัน
Console.WriteLine("Are both the array objects equal? = " + arr1.Equals(arr2));
}
}
ผลลัพธ์
First integer array... 10 20 30 40 50 Second integer array... 25 25 40 55 70 Are both the array objects equal? = True
สรุปและข้อสังเกตสำคัญ
- เมธอด
Equals()ของอาเรย์ (สืบทอดจาก Object) ทำการเปรียบเทียบ reference equality — คืนค่าtrueก็ต่อเมื่อตัวแปรทั้งสองชี้ไปยัง ออบเจ็กต์เดียวกันในหน่วยความจำ - ในตัวอย่างที่ 2:
arr1 = arr2ทำให้ทั้งคู่อ้างอิงออบเจ็กต์เดียวกัน จึงคืนค่าtrue - ไม่ได้เปรียบเทียบเนื้อหา (value equality)! แม้สองอาเรย์จะมีค่าเหมือนกันทุกตัว แต่เป็นออบเจ็กต์คนละตัว จะคืนค่า
false
วิธีเปรียบเทียบเนื้อหาอาเรย์ให้ถูกต้อง
1. ใช้ LINQ SequenceEqual() (แนะนำ)
using System.Linq;
int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 1, 2, 3 };
bool areEqual = arr1.SequenceEqual(arr2); // true
2. ใช้ StructuralComparisons.StructuralEqualityComparer
using System.Collections;
int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 1, 2, 3 };
bool areEqual = StructuralComparisons.StructuralEqualityComparer.Equals(arr1, arr2); // true
3. เขียนเมธอดเปรียบเทียบเอง
public static bool ArraysEqual<T>(T[] a1, T[] a2)
{
if (a1 == null || a2 == null) return a1 == a2;
if (a1.Length != a2.Length) return false;
for (int i = 0; i < a1.Length; i++)
{
if (!EqualityComparer<T>.Default.Equals(a1[i], a2[i])) return false;
}
return true;
}
ข้อแนะนำ
- อย่าใช้
array1.Equals(array2)สำหรับเปรียบเทียบเนื้อหา — จะได้ผลผิด - ใช้
SequenceEqual()จาก LINQ สำหรับโค้ดทั่วไป (สะดวก อ่านง่าย) - ใช้
StructuralEqualityComparerเมื่อต้องการเปรียบเทียบโครงสร้าง (รองรับ nested arrays)