C#-এ `List<T>`-এর দুটি গুরুত্বপূর্ণ প্রপার্টি রয়েছে: Count (বর্তমান উপাদান সংখ্যা) এবং Capacity (অ্যালোকেটেড মেমরি ক্যাপাসিটি)।beginners প্রায় এই দুটো গুলিয়ে ফেলে।
Count vs Capacity - মূল পার্থক্য
| প্রপার্টি | অর্থ | বদলায় কবে |
|---|---|---|
Count | লিস্টে বর্তমানে কতটি উপাদান আছে | `Add`, `Remove`, `Clear` কল করলে |
Capacity | অन्तর্নিহিত অ্যারে কতটি উপাদান ধারণ করতে পারে (রিসাইজ ছাড়া) | অটোমেটিক্যালি ডাবল হয় যখন `Count > Capacity` |
উদাহরণ: Count vs Capacity ডেমো
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
var list = new List<int>();
Console.WriteLine($"শুরু: Count={list.Count}, Capacity={list.Capacity}");
// উপাদান যোগ করুন
for (int i = 1; i <= 10; i++)
{
list.Add(i * 10);
Console.WriteLine($"Add({i*10}): Count={list.Count}, Capacity={list.Capacity}");
}
Console.WriteLine($"\nফাইনাল: Count={list.Count}, Capacity={list.Capacity}");
// ক্যাপাসিটি ম্যানুয়ালি সেট করা
list.Capacity = 20;
Console.WriteLine($"Capacity=20 সেট করার পর: Count={list.Count}, Capacity={list.Capacity}");
// TrimExcess - অপরিশিষ্ট ক্যাপাসিটি ফাঁকা করুন
list.TrimExcess();
Console.WriteLine($"TrimExcess(): Count={list.Count}, Capacity={list.Capacity}");
}
}
আউটপুট
শুরু: Count=0, Capacity=0
Add(10): Count=1, Capacity=4
Add(20): Count=2, Capacity=4
Add(30): Count=3, Capacity=4
Add(40): Count=4, Capacity=4
Add(50): Count=5, Capacity=8
Add(60): Count=6, Capacity=8
Add(70): Count=7, Capacity=8
Add(80): Count=8, Capacity=8
Add(90): Count=9, Capacity=16
Add(100): Count=10, Capacity=16
ফাইনাল: Count=10, Capacity=16
Capacity=20 সেট করার পর: Count=10, Capacity=20
TrimExcess(): Count=10, Capacity=10
Capacity কীভাবে বেড়ে (Growth Strategy)
- শুরু: 0
- প্রথম Add: 4
- পূর্ণ হলে: ডাবল হয় (4→8→16→32→64...)
- এটি অ্যামোর্টাইজড O(1) ইনসারশন নিশ্চিত করে
প্রি-অ্যালোকেশন (Performance Optimization)
যদি আনুমানিক সাইজ জানা থাকে, ক্যাপাসিটি প্রথমেই সেট করুন রি-অ্যালোকেশন এড়াতে:
// খারাপ: বারবার রি-অ্যালোকেশন
var list1 = new List<int>();
for (int i = 0; i < 10000; i++) list1.Add(i);
// ভালো: একবারে অ্যালোকেট
var list2 = new List<int>(10000);
for (int i = 0; i < 10000; i++) list2.Add(i);
// আরও ভালো: Collection Expression (C# 12+)
var list3 = new List<int>(10000) { 1, 2, 3 }; //Capacity 10000, Count 3
সাধারণ ভুল: Capacity কে Size মনে করা
// ভুল - Capacity দেখাচ্ছে, আসল সাইজ নয়
Console.WriteLine("Size: " + list.Capacity); // ভুল!
// সঠিক - Count ব্যবহার করুন
Console.WriteLine("Size: " + list.Count); // সঠিক!
Array vs List - সাইজ পাওয়া
// Array
int[] arr = new int[10];
int arrSize = arr.Length; // ফিক্সড
// List
var list = new List<int>();
int listSize = list.Count; // ডাইনামিক
সারসংক্ষেপ
- আসল সাইজ (উপাদান সংখ্যা): `list.Count`
- অ্যালোকেটেড ক্যাপাসিটি: `list.Capacity`
- পূর্বে ক্যাপাসিটি সেট করুন পারফরম্যান্সের জন্য (`new List<T>(expectedSize)`)
- মেমরি অপ্টিমাইজ: `list.TrimExcess()` কল করুন বড় লিস্ট প্রসেসিংয়ের পর