LINQ (Language Integrated Query) এর সাহায্যে আপনি সহজেই Custom Classes এবং Collections এ ডেটা ম্যানিপুলেট, ফিল্টার এবং প্রসেস করতে পারেন। LINQ সাধারণত IEnumerable বা IQueryable টাইপের ডেটা কাঠামোতে কাজ করে, এবং এর মাধ্যমে আপনি যে কোনো Collection বা Custom Class এর উপর কুয়েরি অপারেশন চালাতে পারেন, যদি তারা এই ইন্টারফেসগুলি ইমপ্লিমেন্ট করে।
এই টিউটোরিয়ালে, আমরা Custom Classes এবং Collections এর উপর LINQ কীভাবে প্রয়োগ করা হয় তা দেখব।
Custom Classes তৈরি করা
প্রথমে, আমরা একটি Custom Class তৈরি করব এবং তারপর LINQ এর সাহায্যে তার উপর বিভিন্ন কুয়েরি প্রয়োগ করব।
ধরা যাক, আমাদের একটি Employee ক্লাস রয়েছে, যেখানে ID, Name, Age, এবং Salary প্রোপার্টি রয়েছে।
using System;
using System.Collections.Generic;
using System.Linq;
class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public double Salary { get; set; }
}
LINQ দিয়ে Custom Class এর উপর কুয়েরি
আমরা একটি List তৈরি করব এবং তার উপর LINQ ব্যবহার করে বিভিন্ন অপারেশন প্রয়োগ করব।
উদাহরণ: LINQ দিয়ে Custom Class এর ডেটা ফিল্টার করা
using System;
using System.Collections.Generic;
using System.Linq;
class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public double Salary { get; set; }
}
class Program
{
static void Main()
{
// Custom class এর একটি List তৈরি
List<Employee> employees = new List<Employee>
{
new Employee { ID = 1, Name = "Alice", Age = 30, Salary = 50000 },
new Employee { ID = 2, Name = "Bob", Age = 35, Salary = 60000 },
new Employee { ID = 3, Name = "Charlie", Age = 40, Salary = 70000 },
new Employee { ID = 4, Name = "David", Age = 25, Salary = 45000 }
};
// LINQ কুয়েরি প্রয়োগ
var highEarners = from e in employees
where e.Salary > 50000
select e;
// ফলাফল প্রদর্শন
foreach (var employee in highEarners)
{
Console.WriteLine($"{employee.Name} earns {employee.Salary}");
}
}
}
আউটপুট:
Bob earns 60000
Charlie earns 70000
এখানে, আমরা Salary এর ভিত্তিতে filter করেছি এবং Where শর্ত ব্যবহার করেছি। LINQ ব্যবহার করে সহজেই Employee ক্লাসের উপর কুয়েরি করা হয়েছে।
LINQ ব্যবহার করে Collections এর উপর কুয়েরি
এখন, আমরা দেখব কিভাবে Collections (যেমন, List<T>, Dictionary<K, V>, Queue<T>, Stack<T>) এর উপর LINQ প্রয়োগ করা যায়।
উদাহরণ ১: List<T> এর উপর LINQ কুয়েরি
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 10, 20, 30, 40, 50, 60, 70 };
// LINQ কুয়েরি: সংখ্যাগুলোর মধ্যে যেগুলো 30 এর বড়
var filteredNumbers = from n in numbers
where n > 30
select n;
// ফলাফল প্রদর্শন
foreach (var number in filteredNumbers)
{
Console.WriteLine(number);
}
}
}
আউটপুট:
40
50
60
70
এখানে, আমরা List এর উপর LINQ কুয়েরি প্রয়োগ করেছি, যেখানে Where শর্ত ব্যবহার করে 30 এর বেশি সংখ্যাগুলি ফিল্টার করা হয়েছে।
উদাহরণ ২: Dictionary<K, V> এর উপর LINQ কুয়েরি
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
Dictionary<int, string> students = new Dictionary<int, string>
{
{ 1, "Alice" },
{ 2, "Bob" },
{ 3, "Charlie" },
{ 4, "David" }
};
// LINQ কুয়েরি: ID অনুযায়ী নামের তালিকা পাওয়া
var studentNames = from s in students
where s.Key % 2 == 0
select s.Value;
// ফলাফল প্রদর্শন
foreach (var name in studentNames)
{
Console.WriteLine(name);
}
}
}
আউটপুট:
Bob
David
এখানে, আমরা Dictionary<int, string> এর উপর LINQ কুয়েরি ব্যবহার করেছি এবং Key এর ভিত্তিতে filtering করেছি।
উদাহরণ ৩: Queue<T> এর উপর LINQ কুয়েরি
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
Queue<string> queue = new Queue<string>();
queue.Enqueue("Alice");
queue.Enqueue("Bob");
queue.Enqueue("Charlie");
queue.Enqueue("David");
// LINQ কুয়েরি: Queue তে থাকা নামগুলোর মধ্যে যেগুলো "B" দিয়ে শুরু
var filteredQueue = from name in queue
where name.StartsWith("B")
select name;
// ফলাফল প্রদর্শন
foreach (var name in filteredQueue)
{
Console.WriteLine(name);
}
}
}
আউটপুট:
Bob
এখানে Queue এর উপর LINQ কুয়েরি প্রয়োগ করা হয়েছে এবং StartsWith মেথড ব্যবহার করে নির্দিষ্ট কন্ডিশন অনুযায়ী ফিল্টার করা হয়েছে।
LINQ ব্যবহার করার সময় কিছু গুরুত্বপূর্ণ টিপস
- Deferred Execution (লেজি এক্সিকিউশন): LINQ কুয়েরি যখন IEnumerable বা IQueryable রিটার্ন করে, তখন এটি deferred execution এর মাধ্যমে কেবল তখনই এক্সিকিউট হয় যখন ডেটার উপর অ্যাক্সেস করা হয়।
- Eager Execution: যদি আপনি ডেটা একত্রিত করার সাথে সাথেই তার ফলাফল দেখতে চান, তবে ToList(), ToArray(), বা ToDictionary() ব্যবহার করুন।
- Performance: LINQ অত্যন্ত শক্তিশালী হলেও, বড় ডেটাসেটের জন্য optimization প্রয়োজন। বিশেষত, Where, Select, OrderBy ইত্যাদি মেথডগুলো একাধিক বার ব্যবহার করা হলে পারফরম্যান্সে নেতিবাচক প্রভাব পড়তে পারে।
- Anonymous Types: LINQ কুয়েরি দিয়ে আপনি Anonymous Types তৈরি করতে পারেন যা নতুন ক্লাস ডিফাইন করা ছাড়াই ডেটা ধারণ করতে সাহায্য করে।
LINQ এর সাহায্যে আপনি Custom Classes এবং Collections এর উপর খুবই সহজে এবং কার্যকরীভাবে ডেটা ম্যানিপুলেট করতে পারেন। LINQ এর সুবিধা হলো এটি কোডকে আরও পরিষ্কার, রিডেবল এবং সংক্ষিপ্ত করে, পাশাপাশি ডেটার সাথে কাজ করার সময় পারফরম্যান্স অপটিমাইজেশনও করতে পারে।
Read more