ব্যবহারিক উদাহরণ যেখানে Tuple। নেট 4.0 ব্যবহার করা যেতে পারে?


97

আমি নেট 4 এ প্রবর্তন টিপল দেখেছি কিন্তু এটি কোথায় ব্যবহার করা যায় তা আমি কল্পনা করতে পারছি না। আমরা সর্বদা একটি কাস্টম ক্লাস বা স্ট্রাক্ট তৈরি করতে পারি।


13
এই বিষয়টি খুব পুরানো বলে মনে করার জন্য এটি একটি ভাল জায়গা। দেখুন সি # 7 এ কী ঘটেছিল !
— মাফ-নরম

উত্তর:


83

মূল বিষয় - এটি সর্বদা একটি কাস্টম ক্লাস বা কাঠামো না করা আরও সুবিধাজনক । মনে হচ্ছে একটি উন্নতি হয় Actionবা Func... এই ধরনের নিজেকে করতে পারেন, কিন্তু এটা সুবিধাজনক যে, তারা কাঠামোর মধ্যে বিদ্যমান।


4
সম্ভবত মূল্য থেকে ইশারা দুটিই MSDN : "। এই ধরনের কোনো পাবলিক স্ট্যাটিক সদস্যদের থ্রেড নিরাপদ কোন দৃষ্টান্ত সদস্যদের থ্রেড নিরাপদ হতে নিশ্চিত করা হয় না। "
— ম্যাট Borja,

ভাল, সম্ভবত ভাষা ডিজাইনারদের উড়ে যাওয়ার সময় কাস্টম প্রকারগুলি তৈরি করা আরও সহজ করা উচিত ছিল, তবে? সুতরাং আমরা অন্য একটি চালু করার পরিবর্তে একই বাক্য গঠন রাখতে পারি?
— টমাস আইদে

@ থমাসইয়েড যা তারা হ'ল গত 15 বছর ধরে করছে। এভাবেই বডিড সদস্যদের যুক্ত করা হয়েছিল এবং এখন টিপলসকে মূল্য দেওয়া হয়। রেকর্ড-স্টাইলের ক্লাসগুলি অগস্টে অগস্টে (এই মন্তব্যের 9 মাস আগে) সি # 7 এর এই সংস্করণটির জন্য কাটা ব্যর্থতা মিস করেছিল এবং সম্ভবত সি # 8-এ প্রকাশিত হচ্ছে। এছাড়াও নোট করুন যে মান টিউপলগুলি সমান-পুরানো শ্রেণিগুলিতে মান দেয় না । ২০০২ সালে এই সমস্ত ফিরে আসার জন্য
— বিজ্ঞানের

আপনার দ্বারা কি বোঝাতে চেয়েছেন convenient not to make a custom class। আপনি কি কাস্টম ক্লাস উদাহরণ তৈরি করে বোঝাতে চাইছেন =new..()?
— অ্যালেক্স

75

টিউপলসের সাহায্যে আপনি সহজেই দ্বিমাত্রিক অভিধান প্রয়োগ করতে পারেন (বা বিষয়টির জন্য n- মাত্রিক)। উদাহরণস্বরূপ, আপনি মুদ্রা বিনিময় ম্যাপিং কার্যকর করতে এই জাতীয় অভিধান ব্যবহার করতে পারেন:

var forex = new Dictionary<Tuple<string, string>, decimal>();
forex.Add(Tuple.Create("USD", "EUR"), 0.74850m); // 1 USD = 0.74850 EUR
forex.Add(Tuple.Create("USD", "GBP"), 0.64128m);
forex.Add(Tuple.Create("EUR", "USD"), 1.33635m);
forex.Add(Tuple.Create("EUR", "GBP"), 0.85677m);
forex.Add(Tuple.Create("GBP", "USD"), 1.55938m);
forex.Add(Tuple.Create("GBP", "EUR"), 1.16717m);
forex.Add(Tuple.Create("USD", "USD"), 1.00000m);
forex.Add(Tuple.Create("EUR", "EUR"), 1.00000m);
forex.Add(Tuple.Create("GBP", "GBP"), 1.00000m);

decimal result;
result = 35.0m * forex[Tuple.Create("USD", "EUR")]; // USD 35.00 = EUR 26.20
result = 35.0m * forex[Tuple.Create("EUR", "GBP")]; // EUR 35.00 = GBP 29.99
result = 35.0m * forex[Tuple.Create("GBP", "USD")]; // GBP 35.00 = USD 54.58

আমি বরং দেশের সংক্ষিপ্তসারগুলির জন্য একটি এনাম ব্যবহার করব। এটা কি সম্ভব?
— জ্যাক

4
অবশ্যই, সমস্যাগুলি ছাড়াই এটি কাজ করা উচিত কারণ এনামগুলি মান ধরণের।
— মারিওভিডাব্লু

@ মারিওভিডাব্লুও বহু-মাত্রিক অ্যারে ব্যবহার করে এটি সম্পন্ন হতে পারে। টিপল কীভাবে কোনও পার্থক্য করে?
— অ্যালেক্স

26

এমএসডিএন ম্যাগাজিনে একটি দুর্দান্ত নিবন্ধ রয়েছে যাতে পেট-ব্যথা এবং ডিজাইনের বিবেচনার বিষয়ে কথা হয় যা বিসিএলে টুপলকে যুক্ত করেছিল। একটি মান ধরণের এবং একটি রেফারেন্স টাইপের মধ্যে নির্বাচন করা বিশেষ আকর্ষণীয়।

নিবন্ধটি স্পষ্ট করে দিয়েছে, টুপলের পিছনে চালিকা শক্তি মাইক্রোসফ্টের অভ্যন্তরে এতগুলি গ্রুপ ছিল যার জন্য এফ # টিম সামনে ছিল। যদিও উল্লেখ করা হয়নি, আমি মনে করি যে সি # (এবং ভিবি.এনইটি) -র নতুন "গতিশীল" কীওয়ার্ডটির সাথে এর সাথে কিছু সম্পর্ক ছিল, গতিশীল ভাষায় টিউপলগুলি খুব সাধারণ।

এটি আপনার নিজের পোকো তৈরির তুলনায় বিশেষত সেরা নয়, কমপক্ষে আপনি সদস্যদের আরও ভাল নাম দিতে পারেন।


আপডেট: সি # সংস্করণ 7-এ একটি বড় সংশোধনের কারণে, এখন আরও অনেকগুলি সিনট্যাক্স প্রেম পাচ্ছে। এই ব্লগ পোস্টে প্রাথমিক ঘোষণা ।


23

এখানে একটি ছোট উদাহরণ - বলুন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা ব্যবহারকারীর আইডির সাহায্যে কোনও ব্যবহারকারীর হ্যান্ডেল এবং ইমেল ঠিকানাটি অনুসন্ধান করতে পারে। আপনি সর্বদা একটি কাস্টম ক্লাস তৈরি করতে পারেন যাতে সেই ডেটা থাকে, বা সেই ডেটার জন্য একটি রেফ / আউট প্যারামিটার ব্যবহার করতে পারেন, বা আপনি কেবল একটি টুপল ফিরে আসতে পারেন এবং একটি নতুন পোকো তৈরি না করেই একটি দুর্দান্ত পদ্ধতির স্বাক্ষর রাখতে পারেন।

public static void Main(string[] args)
{
    int userId = 0;
    Tuple<string, string> userData = GetUserData(userId);
}

public static Tuple<string, string> GetUserData(int userId)
{
    return new Tuple<string, string>("Hello", "World");
}

10
এটি তবে একটি ভাল উদাহরণ, টুপলের ব্যবহারকে ন্যায়সঙ্গত করে না।
— অমিতাভ

7
আপনি আলাদা মানগুলি ফিরিয়ে দিচ্ছেন বলে একটি টিপল এখানে একটি শালীন ফিট; আপনি যখন বিভিন্ন ধরণের একাধিক মান প্রত্যাবর্তন করেন তখন একটি টিপল আরও জ্বলজ্বল করে ।
— মার্ক রুশকফ

21
আর একটি ভাল উদাহরণ হ'ল ইনট্রি ট্রাই পার্স, যেহেতু আপনি আউটপুট প্যারামিটারটি সরিয়ে ফেলতে পারেন এবং এর পরিবর্তে একটি টুপল ব্যবহার করতে পারেন। সুতরাং আপনি থাকতে পারেন Tuple<bool, T> TryParse<T>(string input)এবং একটি আউটপুট প্যারামিটার ব্যবহার করার পরিবর্তে, আপনি উভয় মান একটি tuple ফিরে পাবেন।
— তেজস

4
বাস্তবে, আপনি যখন F # থেকে কোনও ট্রাইপার্স পদ্ধতিতে কল করেন ঠিক তেমনটি ঘটে।
— জোয়েল মুলার

23

আমি প্রকল্প ইউলারের 11 টি সমস্যা সমাধানের জন্য একটি টিপল ব্যবহার করেছি :

class Grid
{
    public static int[,] Cells = { { 08, 02, 22, // whole grid omitted

    public static IEnumerable<Tuple<int, int, int, int>> ToList()
    {
        // code converts grid to enumeration every possible set of 4 per rules
        // code omitted
    }
}

এখন আমি এটি দিয়ে পুরো সমস্যাটি সমাধান করতে পারি:

class Program
{
    static void Main(string[] args)
    {
        int product = Grid.ToList().Max(t => t.Item1 * t.Item2 * t.Item3 * t.Item4);
        Console.WriteLine("Maximum product is {0}", product);
    }
}

আমি পারে এই জন্য একটি কাস্টম টাইপ ব্যবহার করেছেন, কিন্তু এটা তাকিয়ে আছে ঠিক Tuple মত ।


16

সি # এর টিপল সিনট্যাক্স হাস্যকরভাবে ভারী, তাই টিপলসটি বেদনাদায়ক বলে ঘোষিত হয়। এবং এটির সাথে প্যাটার্ন মিল নেই, তাই এটি ব্যবহারে বেদনাদায়কও।

তবে মাঝেমধ্যে আপনি কেবল কোনও শ্রেণি তৈরি না করেই কেবলমাত্র বস্তুগুলির একটি অ্যাড-হক গ্রুপিং করতে চান। উদাহরণস্বরূপ, ধরা যাক আমি একটি তালিকা একত্রিত করতে চেয়েছিলাম, তবে আমি একটিটির পরিবর্তে দুটি মান চাই:

// sum and sum of squares at the same time
var x =
    Enumerable.Range(1, 100)
    .Aggregate((acc, x) => Tuple.Create(acc.Item1 + x, acc.Item2 + x * x));

একক ফলাফলের সাথে মানের সংমিশ্রণের পরিবর্তে আসুন একটি একক ফলাফলকে মান সংগ্রহের ক্ষেত্রে প্রসারিত করি। এই ফাংশনটি লেখার সহজতম উপায় হ'ল:

static IEnumerable<T> Unfold<T, State>(State seed, Func<State, Tuple<T, State>> f)
{
    Tuple<T, State> res;
    while ((res = f(seed)) != null)
    {
        yield return res.Item1;
        seed = res.Item2;
    }
}

fকিছু রাষ্ট্রকে টুপলে রূপান্তরিত করে। আমরা টিউপল থেকে প্রথম মানটি ফিরিয়ে দেব এবং আমাদের নতুন রাষ্ট্রকে দ্বিতীয় মানতে সেট করব। এটি আমাদের গণনা জুড়ে রাজ্য ধরে রাখতে দেয়।

আপনি এটি যেমন ব্যবহার করুন:

// return 0, 2, 3, 6, 8
var evens =
    Unfold(0, state => state < 10 ? Tuple.Create(state, state + 2) : null)
    .ToList();

// returns 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
var fibs =
    Unfold(Tuple.Create(0, 1), state => Tuple.Create(state.Item1, Tuple.Create(state.Item2, state.Item1 + state.Item2)))
    .Take(10).ToList();

evensমোটামুটি সোজা, তবে fibsএকটু চালাক। এটি stateআসলে একটি টুপল যা যথাক্রমে ফাইব (এন-2) এবং ফাইব (এন -1) ধারণ করে।


4
+1 টিপল.ক্রেট হ্যান্ড শর্টহ্যান্ডের জন্যnew Tuple<Guid,string,...>
— অ্যারোনলএস

@ জুলিয়েট স্টেট কীওয়ার্ডের কী ব্যবহার
— ইরফান্দার

7

আমি তাদের অপব্যবহার পছন্দ করি না, যেহেতু তারা এমন কোড তৈরি করে যা নিজের ব্যাখ্যা দেয় না, তবে তারা ফ্লাইট মিশ্রণ কীগুলি বাস্তবায়িত করতে দুর্দান্ত, কারণ তারা IStructuralEquatable এবং IStructuralComparable বাস্তবায়ন করে (অনুসন্ধান এবং আদেশ উভয় ব্যবহারের জন্য) উদ্দেশ্য)।

এবং তারা তাদের সমস্ত আইটেমের হ্যাশকোডগুলি অভ্যন্তরীণভাবে একত্রিত করে; উদাহরণস্বরূপ, এখানে টিপলের গেটহ্যাশকোড (আইএলএসপি থেকে নেওয়া):

    int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
    {
        return Tuple.CombineHashCodes(comparer.GetHashCode(this.m_Item1), comparer.GetHashCode(this.m_Item2), comparer.GetHashCode(this.m_Item3));
    }

7

টিপলস একসাথে একাধিক এসিঙ্ক আইও অপারেশন করার জন্য এবং সমস্ত মান একসাথে ফিরে আসার জন্য দুর্দান্ত। এটি Tuple এর সাথে এবং না করেই করার উদাহরণ রয়েছে। টিপলস আসলে আপনার কোডটি আরও পরিষ্কার করতে পারে!

(বাজে বাসা!) ছাড়াই:

Task.Factory.StartNew(() => data.RetrieveServerNames())
    .ContinueWith(antecedent1 =>
        {
            if (!antecedent1.IsFaulted)
            {
                ServerNames = KeepExistingFilter(ServerNames, antecedent1.Result);
                Task.Factory.StartNew(() => data.RetrieveLogNames())
                    .ContinueWith(antecedent2 =>
                        {
                            if (antecedent2.IsFaulted)
                            {
                                LogNames = KeepExistingFilter(LogNames, antecedent2.Result);
                                Task.Factory.StartNew(() => data.RetrieveEntryTypes())
                                    .ContinueWith(antecedent3 =>
                                        {
                                            if (!antecedent3.IsFaulted)
                                            {
                                                EntryTypes = KeepExistingFilter(EntryTypes, antecedent3.Result);
                                            }
                                        });
                            }
                        });
            }
        });

টিপল সহ

Task.Factory.StartNew(() =>
    {
        List<string> serverNames = data.RetrieveServerNames();
        List<string> logNames = data.RetrieveLogNames();
        List<string> entryTypes = data.RetrieveEntryTypes();
        return Tuple.Create(serverNames, logNames, entryTypes);
    }).ContinueWith(antecedent =>
        {
            if (!antecedent.IsFaulted)
            {
                ServerNames = KeepExistingFilter(ServerNames, antecedent.Result.Item1);
                LogNames = KeepExistingFilter(LogNames, antecedent.Result.Item2);
                EntryTypes = KeepExistingFilter(EntryTypes, antecedent.Result.Item3);
            }
        });

যদি আপনি যাইহোক যাইহোক ইমপ্লাইড টাইপ সহ কোনও বেনামি ফাংশন ব্যবহার করছেন তবে আপনি টিপলটি ব্যবহার করে কোডটি কম স্পষ্ট করছেন না। একটি পদ্ধতি থেকে একটি টুপল পুনরায় চালু? আমার নম্র মতে কোড স্পষ্টতা কী যখন অল্প পরিমাণে ব্যবহার করুন। আমি জানি যে সি # তে কার্যকরী প্রোগ্রামিং প্রতিরোধ করা শক্ত, তবে আমাদের সেই পুরানো ক্লানকি "অবজেক্ট ওরিয়েন্টেড" সি # প্রোগ্রামারদের সবাই বিবেচনা করতে হবে।


5

টিপলগুলি কার্যকরী ভাষাগুলিতে প্রচুরভাবে ব্যবহৃত হয় যা তাদের সাথে আরও বেশি কিছু করতে পারে, এখন এফ # একটি 'অফিসিয়াল'। নেট ভাষা আপনি এটি সি # এর সাথে হস্তক্ষেপ করতে এবং দুটি ভাষায় লিখিত কোডের মধ্যে পাস করতে চাইতে পারেন।


পাইপন এবং রুবির মতো কয়েকটি জনপ্রিয় স্ক্রিপ্টিং ভাষার জন্যও টিউপসগুলি তৈরি করা হয় (এটিতে ইন্টারওপ ... আইরন পাইথন / রুবি অন্তর্ভুক্তের জন্য নেট বাস্তবায়নও রয়েছে)।
— মিউট্যান্ট নিনজাকোডমোনকি

5

আমি Tupleবেশিরভাগ পরিস্থিতিতে এড়াতে চাইছি যেহেতু এটি পাঠযোগ্যতায় ব্যথা করে। যাইহোক, Tupleযখন আপনাকে সম্পর্কিত না থাকা ডেটা গোষ্ঠী করতে হবে তখন দরকারী।

উদাহরণস্বরূপ, ধরুন আপনার কাছে গাড়ি এবং যে শহরগুলি তারা কেনা হয়েছিল তার একটি তালিকা রয়েছে:

Mercedes, Seattle
Mustang, Denver
Mercedes, Seattle
Porsche, Seattle
Tesla, Seattle
Mercedes, Seattle

আপনি প্রতিটি শহরে প্রতিটি গাড়ির জন্য সংখ্যাকে একত্রিত করতে চান:

Mercedes, Seattle [3]
Mustang, Denver [1]
Porsche, Seattle [1]
Tesla, Seattle [1]

এটি করতে, আপনি একটি তৈরি করুন Dictionary। আপনার স্বল্প কিছু সু্যোগ আছে:

  1. একটি তৈরি করুন Dictionary<string, Dictionary<string, int>>।
  2. একটি তৈরি করুন Dictionary<CarAndCity, int>।
  3. একটি তৈরি করুন Dictionary<Tuple<string, string>, int>।

পঠনযোগ্যতা প্রথম বিকল্পের সাথে হারিয়ে যায়। এটির জন্য আপনাকে আরও অনেক কোড লিখতে হবে।

দ্বিতীয় বিকল্পটি কাজ করে এবং সংযোগযুক্ত, তবে গাড়ি এবং শহরটি সত্যই সম্পর্কিত নয় এবং সম্ভবত একসাথে কোনও শ্রেণিতে অন্তর্ভুক্ত নয়।

তৃতীয় বিকল্পটি সংক্ষিপ্ত এবং পরিষ্কার। এটি একটি ভাল ব্যবহার Tuple।


4

আমার মাথার উপরের অংশের কয়েকটি উদাহরণ:

  • একটি এক্স এবং ওয়াই অবস্থান (এবং জেড যদি আপনি চান)
  • একটি প্রস্থ এবং উচ্চতা
  • সময়ের সাথে কিছু পরিমাপ করা হয়

উদাহরণস্বরূপ আপনি কেবলমাত্র পয়েন্ট / পয়েন্টএফএফ এবং আকার / সাইজএফ ব্যবহার করার জন্য সিস্টেমে.ড্রয়িং কোনও ওয়েব অ্যাপ্লিকেশনটিতে অন্তর্ভুক্ত করতে চান না।


4
Tupleযেমন সমালোচনামূলক পরিস্থিতিতে যেমন সুবিধাজনক Pointবা SomeVectorযখন গ্রাফিক অপারেশন করছেন দরকারী হতে পারে। এটি দুটি মানকে হাইলাইট করে যা একে অপরের সাথে খুব আবদ্ধ। কোড পড়ার সময় আমি প্রায়শই স্টার্টটাইম এবং এন্ডটাইম নামের বৈশিষ্ট্যগুলি দেখেছি, তবে তারিখের সময় এবং একটি সময়কালের চেয়েও ভাল, একটি টুপল আপনাকে আপনার ব্যবসার যুক্তির এই অঞ্চলে প্রতিবার পরিচালিত হওয়ার সময় উভয় মান বিবেচনা করতে বাধ্য করে। বা "আরে, ডেটা পরিবর্তিত হয়েছে (বুল), নিবিড় বাঁধাইয়ের পরিবর্তে ভারী প্রক্রিয়াজাতকরণে ডেটা (অন্যান্য ধরণ) এখানে"।
— লিয়ন পেলেটিয়ার

3

আপনার ব্যবহারের ক্ষেত্রে খুব সতর্ক হওয়া উচিত Tupleএবং এটি করার আগে সম্ভবত দুবার চিন্তা করা উচিত। আমার পূর্ববর্তী অভিজ্ঞতা থেকে আমি জানতে পেরেছি যে Tupleকোড ব্যবহার করে ভবিষ্যতে পড়া এবং সমর্থন করা খুব কঠিন হয়ে যায়। কিছুক্ষণ আগে, আমাকে এমন কিছু কোড ঠিক করতে হয়েছিল যেখানে প্রায় সর্বত্র টিপলস ব্যবহৃত হত। যথাযথ অবজেক্টের মডেলগুলি সম্পর্কে চিন্তা করার পরিবর্তে তারা কেবল টিপলস ব্যবহার করেছিল। এটা দুঃস্বপ্ন ছিল ... কখনও কখনও আমি সেই ছেলেটিকে মেরে ফেলতে চেয়েছিলাম যিনি কোড লিখেছিলেন ...

আপনার Tupleএটি ব্যবহার করা উচিত নয় এবং এটি খারাপ বা কিছু এবং আপনি শতভাগ নিশ্চিত যে এমন কিছু কাজ রয়েছে যেখানে Tupleসবচেয়ে ভাল প্রার্থী ব্যবহার করা উচিত, তবে সম্ভবত আপনার আবার চিন্তা করা উচিত, আপনার কি সত্যিই এটি দরকার? ?


1

আমার কাছে পাওয়া টিপলসের সর্বাধিক ব্যবহার হ'ল যখন কোনও পদ্ধতি থেকে 1 ধরণের বস্তুর বেশি প্রত্যাবর্তনের প্রয়োজন হয়, আপনি জানেন কী কী অবজেক্টের ধরণ এবং সংখ্যা তারা হবে এবং এটি দীর্ঘ তালিকা নয়।

অন্যান্য সহজ বিকল্পগুলি একটি 'আউট' প্যারামিটার ব্যবহার করবে

private string MyMethod(out object)

বা অভিধান তৈরি করা

Dictionary<objectType1, objectType2>

একটি টুপল ব্যবহার করে হয় হয় 'আউট' অবজেক্ট তৈরি করা বা অভিধানে মূলত এন্ট্রিটি সন্ধান করা;


1

টুপলে আমার সবেমাত্র একটি সমস্যার সমাধান খুঁজে পেয়েছি। এটি কোনও পদ্ধতির সুযোগে শ্রেণি ঘোষণার মতো তবে এর ক্ষেত্রের নামগুলি অলস ঘোষণার সাথে। আপনি টিউপসগুলির সংগ্রহ, এটির একক উদাহরণ দিয়ে পরিচালনা করেন এবং তারপরে আপনার টিপলকে ভিত্তি করে প্রয়োজনীয় ক্ষেত্রের নামগুলি সহ বেনামে টাইপের একটি সংগ্রহ তৈরি করুন। এটি আপনাকে এই উদ্দেশ্যে নতুন ক্লাস তৈরি করা থেকে বিরত রাখে।

কাজটি হ'ল লিনকিউ থেকে কোনও অতিরিক্ত ক্লাস ছাড়াই একটি জেএসএন প্রতিক্রিয়া লিখুন:

 //I select some roles from my ORM my with subrequest and save results to Tuple list
 var rolesWithUsers = (from role in roles
                       select new Tuple<string, int, int>(
                         role.RoleName, 
                         role.RoleId, 
                         usersInRoles.Where(ur => ur.RoleId == role.RoleId).Count()
                      ));

 //Then I add some new element required element to this collection
 var tempResult = rolesWithUsers.ToList();
 tempResult.Add(new Tuple<string, int, int>(
                        "Empty", 
                         -1,
                         emptyRoleUsers.Count()
                      ));

 //And create a new anonimous class collection, based on my Tuple list
 tempResult.Select(item => new
            {
                GroupName = item.Item1,
                GroupId = item.Item2,
                Count = item.Item3
            });


 //And return it in JSON
 return new JavaScriptSerializer().Serialize(rolesWithUsers);

কারণ হিসাবে আমরা আমাদের গ্রুপগুলির জন্য একটি নতুন ক্লাস ঘোষণার সাথে এটি করতে পারি, তবে নতুন ক্লাসের ঘোষণা ছাড়াই এ জাতীয় একটি অনন্য সংগ্রহ তৈরি করার ধারণা।


1

আমার ক্ষেত্রে ঠিক আছে, যখন আমি জানতে পারি যে আমরা একটি অ্যাসিঙ্ক্রোনাস পদ্ধতিতে প্যারামিটার ব্যবহার করতে পারি না তখন আমাকে একটি টুপল ব্যবহার করতে হয়েছিল। এটি সম্পর্কে এখানে পড়ুন । আমারও আলাদা রিটার্ন টাইপের দরকার ছিল। সুতরাং আমি আমার ফিরতি টাইপের পরিবর্তে একটি টুপল ব্যবহার করেছি এবং পদ্ধতিটিকে অ্যাসিঙ্ক হিসাবে চিহ্নিত করেছি।

নীচে নমুনা কোড।

...
...
// calling code.
var userDetails = await GetUserDetails(userId);
Console.WriteLine("Username : {0}", userDetails.Item1);
Console.WriteLine("User Region Id : {0}", userDetails.Item2);
...
...

private async Tuple<string,int> GetUserDetails(int userId)
{
    return new Tuple<string,int>("Amogh",105);
    // Note that I can also use the existing helper method (Tuple.Create).
}

এখানে Tuple সম্পর্কে আরও পড়ুন । আশাকরি এটা সাহায্য করবে.


আমি ধরে নিয়েছি আপনি কোনও বেনামে টাইপ বা অ্যারে (বা গতিশীল বিষয়বস্তু) ফেরত দিতে চান নি
— ozzy432836

0

যখন আপনাকে তারগুলি জুড়ে প্রেরণ করতে হবে বা অ্যাপ্লিকেশনটির বিভিন্ন স্তরে প্রেরণ করতে হবে এবং একাধিক বস্তু একের সাথে একত্রীকরণ করতে হবে:

উদাহরণ:

var customerDetails = new Tuple<Customer, List<Address>>(mainCustomer, new List<Address> {mainCustomerAddress}).ToCustomerDetails();

এক্সটেনশনমিথড:

public static CustomerDetails ToCustomerDetails(this Tuple<Website.Customer, List<Website.Address>> customerAndAddress)
    {
        var mainAddress = customerAndAddress.Item2 != null ? customerAndAddress.Item2.SingleOrDefault(o => o.Type == "Main") : null;
        var customerDetails = new CustomerDetails
        {
            FirstName = customerAndAddress.Item1.Name,
            LastName = customerAndAddress.Item1.Surname,
            Title = customerAndAddress.Item1.Title,
            Dob = customerAndAddress.Item1.Dob,
            EmailAddress = customerAndAddress.Item1.Email,
            Gender = customerAndAddress.Item1.Gender,
            PrimaryPhoneNo = string.Format("{0}", customerAndAddress.Item1.Phone)
        };

        if (mainAddress != null)
        {
            customerDetails.AddressLine1 =
                !string.IsNullOrWhiteSpace(mainAddress.HouseName)
                    ? mainAddress.HouseName
                    : mainAddress.HouseNumber;
            customerDetails.AddressLine2 =
                !string.IsNullOrWhiteSpace(mainAddress.Street)
                    ? mainAddress.Street
                    : null;
            customerDetails.AddressLine3 =
                !string.IsNullOrWhiteSpace(mainAddress.Town) ? mainAddress.Town : null;
            customerDetails.AddressLine4 =
                !string.IsNullOrWhiteSpace(mainAddress.County)
                    ? mainAddress.County
                    : null;
            customerDetails.PostCode = mainAddress.PostCode;
        }
...
        return customerDetails;
    }

0

একটি আউট প্যারামিটার দুর্দান্ত হয় যখন কেবল কয়েকটি মানগুলি ফেরত পাওয়া দরকার তবে আপনি যখন 4, 5, 6 বা তার বেশি মানগুলির ফিরে আসতে হবে তখন এটি অনর্থক হতে পারে। একাধিক মান প্রত্যাবর্তনের জন্য আরেকটি বিকল্প হ'ল একটি ব্যবহারকারী-সংজ্ঞায়িত শ্রেণি / কাঠামো তৈরি করা এবং ফিরে দেওয়া বা কোনও পদ্ধতির মাধ্যমে ফিরিয়ে নেওয়া দরকার এমন সমস্ত মানকে প্যাকেজ করতে একটি টুপল ব্যবহার করা।

মানগুলি ফিরিয়ে দেওয়ার জন্য শ্রেণি / কাঠামো ব্যবহার করে প্রথম বিকল্পটি সোজা। ঠিক তেমন টাইপ তৈরি করুন (উদাহরণস্বরূপ এটি একটি কাঠামো):

public struct Dimensions
{
public int Height;
public int Width;
public int Depth;
}

দ্বিতীয় বিকল্প, একটি টিপল ব্যবহার করে, এটি একটি ইউজারডিফাইন্ড অবজেক্ট ব্যবহারের চেয়ে আরও মার্জিত সমাধান। বিভিন্ন ধরণের বিভিন্ন সংখ্যার মান ধরে রাখতে একটি টুপল তৈরি করা যেতে পারে। এছাড়াও, আপনি টিপলে যে ডেটা সঞ্চয় করেন তা অপরিবর্তনীয়; একবার আপনি কনস্ট্রাক্টর বা স্ট্যাটিক তৈরি পদ্ধতির মাধ্যমে টুপলে ডেটা যুক্ত করলে সেই ডেটা পরিবর্তন করা যায় না। টিপলস আটটি পৃথক মান পর্যন্ত গ্রহণ করতে পারে। আপনার যদি আটটির বেশি মান প্রত্যাবর্তনের প্রয়োজন হয় তবে আপনাকে বিশেষ টিউপল শ্রেণি ব্যবহার করতে হবে: টিপল ক্লাস আটটির বেশি মান সহ একটি টিপল তৈরি করার সময় আপনি স্ট্যাটিক তৈরি পদ্ধতিটি ব্যবহার করতে পারবেন না instead পরিবর্তে আপনাকে অবশ্যই শ্রেণীর কনস্ট্রাক্টর ব্যবহার করতে হবে। এভাবে আপনি 10 পূর্ণসংখ্যার মানের একটি টিপল তৈরি করবেন:

var values = new Tuple<int, int, int, int, int, int, int, Tuple<int, int, int>> (
1, 2, 3, 4, 5, 6, 7, new Tuple<int, int, int> (8, 9, 10));

অবশ্যই, আপনি প্রতিটি এম্বেড হওয়া টিপলটির শেষে আরও টিপলস যোগ করতে চালিয়ে যেতে পারেন, আপনার প্রয়োজনীয় যে কোনও আকারের টুপল তৈরি করে।


0

কেবল প্রোটোটাইপিংয়ের জন্য - টিপলস অর্থহীন। এগুলি ব্যবহার করা সুবিধাজনক তবে এটি কেবল একটি শর্টকাট! প্রোটোটাইপগুলির জন্য - জরিমানা। এই কোডটি পরে মুছতে ভুলবেন না।

এটি সহজে লেখা, পড়া শক্ত। ক্লাস, অভ্যন্তরীণ ক্লাস, বেনাম শ্রেণি ইত্যাদির চেয়ে এর কোনও দৃশ্যমান সুবিধা নেই has


0

ঠিক আছে আমি সি # 7 তে একই সমস্যাটি সমাধান করার জন্য 3 টি উপায় চেষ্টা করেছি এবং আমি টিপলসের জন্য একটি ব্যবহারের সন্ধান পেয়েছি।

ওয়েব প্রকল্পগুলিতে গতিশীল ডেটা নিয়ে কাজ করা ম্যাপিং ইত্যাদির সময় মাঝে মাঝে ব্যথা হতে পারে etc.

আমি পছন্দ করি যেভাবে টিপল আইটেম 1, আইটেম 2, আইটেমএন-এ স্বয়ংক্রিয়ভাবে ম্যাপিং করেছে যা অ্যারে সূচকগুলি ব্যবহার করার চেয়ে আপনি শক্তিশালী বলে মনে করেন যেখানে আপনি কোনও সূত্রের আইটেমের বাইরে গিয়ে বা বেনামে টাইপ ব্যবহার করতে পারেন যেখানে আপনি কোনও সম্পত্তির নাম ভুল বানান করতে পারেন।

এটি কেবল মনে হয় একটি টিপল ব্যবহার করে একটি ডিটিও বিনামূল্যে তৈরি করা হয়েছে এবং আমি আইটেমএন ব্যবহার করে সমস্ত বৈশিষ্ট্য অ্যাক্সেস করতে পারি যা এই উদ্দেশ্যে পৃথক ডিটিও তৈরি না করেই স্থির টাইপিংয়ের মতো মনে হয়।

using System;

namespace Playground
{
    class Program
    {
        static void Main(string[] args)
        {
            var tuple = GetTuple();
            Console.WriteLine(tuple.Item1);
            Console.WriteLine(tuple.Item2);
            Console.WriteLine(tuple.Item3);
            Console.WriteLine(tuple);

            Console.WriteLine("---");

            var dyn = GetDynamic();
            Console.WriteLine(dyn.First);
            Console.WriteLine(dyn.Last);
            Console.WriteLine(dyn.Age);
            Console.WriteLine(dyn);

            Console.WriteLine("---");

            var arr = GetArray();
            Console.WriteLine(arr[0]);
            Console.WriteLine(arr[1]);
            Console.WriteLine(arr[2]);
            Console.WriteLine(arr);

            Console.Read();

            (string, string, int) GetTuple()
            {
                return ("John", "Connor", 1);
            }

            dynamic GetDynamic()
            {
                return new { First = "John", Last = "Connor", Age = 1 };
            }

            dynamic[] GetArray()
            {
                return new dynamic[] { "John", "Connor", 1 };
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.