কম্পিউটার টিউটোরিয়াল

C#-তে দুটি LinkedList অবজেক্ট সমান কিনা যাচাই করা

LinkedList<T> ক্লাসের Equals(object obj) মেথড ব্যবহার করে দুটি LinkedList অবজেক্ট সমান কিনা তা যাচাই করা যায়। গুরুত্বপূর্ণ: LinkedList ক্লাস Equals মেথড ওভাররাইড করে না, তাই এটি রেফারেন্স সমতা চেক করে (সামান্য Object.Equals-এর মতো)। দুটি আলাদা LinkedList অবজেক্ট একই কন্টেন্ট থাকলেও সমান নয়।

উদাহরণ ১: একই রেফারেন্স (সমান)

using System;
using System.Collections.Generic;

public class Demo {
    public static void Main(string[] args) {
        LinkedList<string> list1 = new LinkedList<string>();
        list1.AddLast("One");
        list1.AddLast("Two");
        list1.AddLast("Three");
        list1.AddLast("Four");
        list1.AddLast("Five");

        Console.WriteLine("LinkedList1 উপাদানসমূহ...");
        foreach (string res in list1) {
            Console.WriteLine(res);
        }

        LinkedList<string> list2 = new LinkedList<string>();
        list2.AddLast("India");
        list2.AddLast("US");
        list2.AddLast("UK");
        list2.AddLast("Canada");
        list2.AddLast("Poland");
        list2.AddLast("Netherlands");

        Console.WriteLine("\nLinkedList2 উপাদানসমূহ...");
        foreach (string res in list2) {
            Console.WriteLine(res);
        }

        // list3 = list2 (রেফারেন্স কপি - সেম অবজেক্ট)
        LinkedList<string> list3 = new LinkedList<string>();
        list3 = list2;

        Console.WriteLine("\nLinkedList3 == LinkedList2? = " + list3.Equals(list2));  // True (সেম রেফারেন্স)
    }
}

আউটপুট

LinkedList1 উপাদানসমূহ...
One
Two
Three
Four
Five

LinkedList2 উপাদানসমূহ...
India
US
UK
Canada
Poland
Netherlands

LinkedList3 == LinkedList2? = True

উদাহরণ ২: আলাদা অবজেক্ট, একই কন্টেন্ট (অসমান - রেফারেন্স কম্পারিজন)

using System;
using System.Collections.Generic;

public class Demo {
    public static void Main(string[] args) {
        LinkedList<string> list1 = new LinkedList<string>();
        list1.AddLast("One");
        list1.AddLast("Two");
        list1.AddLast("Three");
        list1.AddLast("Four");
        list1.AddLast("Five");

        Console.WriteLine("LinkedList1 উপাদানসমূহ...");
        foreach (string res in list1) {
            Console.WriteLine(res);
        }

        LinkedList<string> list2 = new LinkedList<string>();
        list2.AddLast("India");
        list2.AddLast("US");
        list2.AddLast("UK");
        list2.AddLast("Canada");
        list2.AddLast("Poland");
        list2.AddLast("Netherlands");

        Console.WriteLine("\nLinkedList2 উপাদানসমূহ...");
        foreach (string res in list2) {
            Console.WriteLine(res);
        }

        // আলাদা অবজেক্ট, Equals() কল
        Console.WriteLine("\nLinkedList2 == LinkedList1? = " + list2.Equals(list1));  // False (আলাদা রেফারেন্স)
    }
}

আউটপুট

LinkedList1 উপাদানসমূহ...
One
Two
Three
Four
Five

LinkedList2 উপাদানসমূহ...
India
US
UK
Canada
Poland
Netherlands

LinkedList2 == LinkedList1? = False

⚠️ গুরুত্বপূর্ণ: LinkedList.Equals() আচরণ

LinkedList<T> ক্লাস Equals মেথড ওভাররাইড করে না। ফলে এটি বেস Object.Equals ব্যবহার করে যা রেফারেন্স সমতা চেক করে। অর্থাৎ:

  • list1.Equals(list2) → true শুধু যদি list1 এবং list2 একই অবজেক্ট রেফার করে।
  • list1.Equals(list1) → true
  • list1.Equals(null) → false

সঠিক পদ্ধতি: LinkedList কন্টেন্ট তুলনা

using System;
using System.Collections.Generic;
using System.Linq;

public class Demo {
    public static void Main() {
        var list1 = new LinkedList<int>(new[] { 1, 2, 3 });
        var list2 = new LinkedList<int>(new[] { 1, 2, 3 });
        var list3 = new LinkedList<int>(new[] { 1, 2, 4 });

        // পদ্ধতি ১: SequenceEqual (LINQ) - সেরা পদ্ধতি
        Console.WriteLine("SequenceEqual(list1, list2): " + list1.SequenceEqual(list2));  // True
        Console.WriteLine("SequenceEqual(list1, list3): " + list1.SequenceEqual(list3));  // False

        // পদ্ধতি ২: ম্যানুয়াল লুপ (নো LINQ ডিপেন্ডেন্সি)
        bool ManualEquals(LinkedList<int> a, LinkedList<int> b) {
            if (a.Count != b.Count) return false;
            var nodeA = a.First;
            var nodeB = b.First;
            while (nodeA != null) {
                if (!Equals(nodeA.Value, nodeB.Value)) return false;
                nodeA = nodeA.Next;
                nodeB = nodeB.Next;
            }
            return true;
        }
        Console.WriteLine("ManualEquals(list1, list2): " + ManualEquals(list1, list2));  // True

        // পদ্ধতি ৩: ToArray() + StructuralComparisons (বড় লিস্টের জন্য স্লো)
        Console.WriteLine("StructuralComparisons: " + 
            System.Collections.IStructuralEquatable.Equals(
                list1.ToArray(), list2.ToArray(), EqualityComparer<int>.Default));  // True
    }
}

LinkedList vs List - সমতা চেক তুলনা

বৈশিষ্ট্যLinkedList<T>List<T>
Equals() ওভাররাইডনা (রেফারেন্স সমতা)না (রেফারেন্স সমতা)
কন্টেন্ট তুলনাSequenceEqual() ব্যবহার করুনSequenceEqual() ব্যবহার করুন
ইন্ডেক্স অ্যাক্সেসনা (O(n) ট্রাভার্সাল)হ্যাঁ O(1)
ইনসারশন/ডিলিশন (মিডল)O(1) নোড রেফারেন্স দিয়েO(n) শিফটিং

সেরা অনুশীলন

  • কন্টেন্ট তুলনার জন্য: list1.SequenceEqual(list2) (LINQ, System.Linq namespace)
  • পারফরম্যান্স-ক্রিটিক্যাল: ম্যানুয়াল নোড ট্রাভার্সাল (নো অ্যালোকেশন)
  • রেফারেন্স চেকের জন্য: ReferenceEquals(list1, list2) বা list1 == list2
  • নাল-সেফ স্ট্যাটিক: object.Equals(list1, list2) (রেফারেন্স সমতা চেক করে)

নোট: LinkedList<T> ডাবলি-লিঙ্কড লিস্ট বাস্তবায়ন। ছোট লিস্টের জন্য List<T> সাধারণত ফাস্ট (ক্যাশে লোক্যালিটি)। LinkedList ব্যবহার করুন যখন মিডল-ইনসারশন/ডিলিশন ফ্রিকোয়েন্ট হয়।

  1. সি শার্প প্রোগ্রাম: দুটি সিকোয়েন্স একই কিনা তা যাচাই করা

  2. C#-এ দুটি ম্যাট্রিক্স ইডেন্টিক্যাল কিনা চেক করা

  3. পাইথন প্যান্ডাস - দুটি Index অবজেক্ট সমান কিনা তা নির্ধারণ করুন

  4. পাইথন প্যান্ডাস: দুটি ডেটাফ্রেম অবজেক্ট সমান কিনা যাচাই করা