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

C#-তে Tuple কখন ব্যবহার করবেন?

Tuple হলো একাধিক মান একসাথে রাখার জন্য হালকা ও নেমড/অনেমড ডেটা স্ট্রাকচার। C# 7.0+ এ ValueTuple (স্ট্রাক্ট) معرفی হয়েছে যা পারফরম্যান্সে ভালো এবং সিনট্যাক্স সুবিধাজনক।

কখন ব্যবহার করবেন?

  • একাধিক রিটার্ন ভ্যালু: out/ref বা কাস্টম ক্লাস ছাড়া
  • একাধিক আর্গুমেন্ট একসাথে পাস: সিঙ্গেল প্যারামিটার হিসেবে
  • টেম্পোরারি ডেটা গ্রুপিং: ক্লাস/স্ট্রাক্ট বানানোর ঝামেলা নেই
  • LINQ কোয়েরি রেজাল্ট: অ্যানোনিমাস টাইপের বদলে
  • Deconstruction: প্যাটার্ন ম্যাচিং, সোয়াপিং

টাপল সিনট্যাক্স (C# 7.0+)

// nommé tuple (নেমড)
var person = (Name: "John", Age: 30, City: "Dhaka");
Console.WriteLine($"{person.Name}, {person.Age}");

// unnamed tuple
var coords = (10, 20);
Console.WriteLine($"{coords.Item1}, {coords.Item2}");

// টাইপ ডিক্লেয়ারেশন
(string Name, int Age) GetPerson() => ("Alice", 25);

উদাহরণ ১: টাপল প্যারামিটার হিসেবে পাস

using System;

class Program {
    static void DisplayTupleValues((int Id, string Value1, string Value2) dummy) {
        Console.WriteLine($"Id = {dummy.Id}");
        Console.WriteLine($"Value1 = {dummy.Value1}");
        Console.WriteLine($"Value2 = {dummy.Value2}");
    }
    
    static void Main() {
        var dummy = (1, "Dummy", "Tuple");
        DisplayTupleValues(dummy);
        Console.ReadLine();
    }
}

আউটপুট:

Id = 1
Value1 = Dummy
Value2 = Tuple

উদাহরণ ২: টাপল রিটার্ন টাইপ হিসেবে

static (int Id, string Value1, string Value2) ReturnTuple() {
    return (1, "Value1", "Value2");
}

static void Main() {
    var result = ReturnTuple();
    Console.WriteLine($"{result.Id} {result.Value1} {result.Value2}");
    // Deconstruction
    var (id, v1, v2) = ReturnTuple();
    Console.ReadLine();
}

আউটপুট:

1 Value1 Value2

পুরানো Tuple ক্লাস (System.Tuple) — লিগেসি


// পুরানো ক্লাস-বেজড Tuple (রেফারেন্স টাইপ, হিপ অ্যালোকেশন)
var oldTuple = Tuple.Create(1, "Hello", "World");
Console.WriteLine(oldTuple.Item1); // 1
Console.WriteLine(oldTuple.Item2); // Hello

সুপারিশ: C# 7.0+ এ ValueTuple (স্ট্রাক্ট, স্ট্যাক-অ্যালোকেটেড, ফাস্ট) ব্যবহার করুন।

উন্নত ব্যবহার: Deconstruction

var (x, y) = (10, 20); // x=10, y=20

// সোয়াপিং - টেম্প ভেরিয়েবল ছাড়া
(a, b) = (b, a);

// প্যাটার্ন ম্যাচিং (C# 9+)
if (person is (Name: "Admin", Age: >= 18)) { ... }

সীমাবদ্ধতা

  • পাবলিক API-তে টাপল রিটার্ন করলে ডকুমেন্টেশন কম স্পষ্ট হয় (কাস্টম রেকর্ড/ক্লাস ভালো)
  • সিরিয়ালাইজেশন (JSON) এ নেমড টাপলের নাম প্রিজার্ভ নাও হতে পারে
  • রিফলেকশনে টাপল এলিমেন্ট অ্যাক্সেস করা জটিল
  1. এক্সেলে VLOOKUP-এর বদলে INDEX-MATCH কখন ব্যবহার করবেন

  2. জাভাতে সিঙ্ক্রোনাইজড ব্লক কখন ব্যবহার করা উচিত?

  3. জাভাতে fillInStackTrace() মেথড কখন ব্যবহার করব

  4. পাইথনে %r এবং %s-এর মধ্যে পার্থক্য এবং কখন কী ব্যবহার করা উচিত