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

ตรวจสอบว่าอาเรย์สองอันเท่ากันหรือไม่ใน C#

บทความนี้สาธิตวิธีตรวจสอบว่าอาเรย์ (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)