আমি এটি যেভাবে দেখছি, একটি টিপল হ'ল ফলাফল শ্রেণি লেখার একটি শর্টকাট (আমি নিশ্চিত যে এর অন্যান্য ব্যবহারও রয়েছে)।
এর জন্য অন্যান্য মূল্যবান ব্যবহার রয়েছেTuple<>
- এদের মধ্যে বেশিরভাগ ক্ষেত্রে নির্দিষ্ট গ্রুপের ধরণের শব্দার্থকতাগুলি বিমূর্ত করা এবং একই ধরণের কাঠামো ভাগ করা, এবং কেবলমাত্র মূল্যবোধের আদেশ অনুসারে এগুলি ব্যবহার করা। সব ক্ষেত্রেই, টিউপলসের একটি সুবিধা হ'ল তারা আপনার নাম-স্থানটিকে কেবলমাত্র ডেটা-ক্লাসের সাথে বিশৃঙ্খলা এড়ানো এড়ায় যা বৈশিষ্ট্যগুলি প্রকাশ করে তবে পদ্ধতি নয়।
এখানে এর জন্য যুক্তিসঙ্গত ব্যবহারের একটি উদাহরণ Tuple<>
:
var opponents = new Tuple<Player,Player>( playerBob, playerSam );
উপরের উদাহরণে আমরা একজোড়া প্রতিপক্ষকে প্রতিনিধিত্ব করতে চাই, একটি নতুন শ্রেণি তৈরি না করেই এই দৃষ্টান্তগুলিকে জোড়া দেওয়ার একটি সহজ উপায় t এখানে অন্য একটি উদাহরণ:
var pokerHand = Tuple.Create( card1, card2, card3, card4, card5 );
একটি জুজু হাতকে কেবল কার্ডের সেট হিসাবে ভাবা যেতে পারে - এবং ধারণাটি প্রকাশ করার জন্য টিপল (হতে পারে) যুক্তিসঙ্গত উপায়।
আমি টিপলসের বিন্দুটি মিস করছি এমন সম্ভাবনাটি বাদ দিয়ে, টিপলের সাথে উদাহরণটি কী কোনও খারাপ ডিজাইনের পছন্দ?
Tuple<>
পাবলিক টাইপের জন্য সর্বজনীন এপিআই এর অংশ হিসাবে দৃ strongly়ভাবে টাইপ করা দৃষ্টান্তগুলি ফিরিয়ে দেওয়া খুব কমই ভাল ধারণা। আপনি নিজেরাই স্বীকৃত হিসাবে, টিপলসটি ব্যবহৃত টিউপল ধরণের উদ্দেশ্য এবং ব্যাখ্যার জন্য দলের সাথে জড়িত (গ্রন্থাগার লেখক, গ্রন্থাগার ব্যবহারকারী) এর আগে সময়ের সাথে সম্মত হওয়া প্রয়োজন। স্বজ্ঞাত এবং স্বচ্ছ এমন এপিআই তৈরি করতে এটি যথেষ্ট চ্যালেঞ্জিং, Tuple<>
জনসমক্ষে কেবলমাত্র এপিআইয়ের অভিপ্রায় এবং আচরণকে অস্পষ্ট করে।
বেনামে প্রকারভেদগুলিও এক প্রকারের টিউপল - তবে এগুলি দৃ .়ভাবে টাইপ করা হয় এবং আপনাকে প্রকারের সাথে সম্পর্কিত বৈশিষ্ট্যের জন্য পরিষ্কার, তথ্যমূলক নাম নির্দিষ্ট করার অনুমতি দেয়। তবে বেনামে বিভিন্ন ধরণের বিভিন্ন পদ্ধতি ব্যবহার করা কঠিন - এগুলি প্রাথমিকভাবে লিনকিউ-র মতো প্রযুক্তিগুলিতে সমর্থন করার জন্য যুক্ত করা হয়েছিল যেখানে অনুমানগুলি এমন ধরণের উত্পাদন করে যেখানে আমরা সাধারণত নাম নির্ধারণ করতে চাই না। (হ্যাঁ, আমি জানি যে একই ধরণের এবং নামযুক্ত বৈশিষ্ট্যযুক্ত বেনামে সংকলক সংহত করে)।
আমার থাম্বের নিয়মটি হ'ল: আপনি যদি আপনার জনসাধারণের ইন্টারফেস থেকে এটি ফিরিয়ে দেন - এটি একটি নামযুক্ত টাইপ করুন ।
টিপলগুলি ব্যবহারের জন্য আমার অন্যান্য নিয়মের নিয়মটি হল: নাম পদ্ধতি যুক্তি এবং তত্পর স্থানীয় লোকের ভেরিয়েবল Tuple<>
যতটা সম্ভব স্পষ্ট - নামটি টিউপলের উপাদানগুলির মধ্যে সম্পর্কের অর্থকে উপস্থাপন করে। আমার var opponents = ...
উদাহরণটি চিন্তা করুন।
এখানে এমন এক বাস্তব-জগতের উদাহরণের উদাহরণ রয়েছে যেখানে আমি কেবলমাত্র আমার নিজের সমাবেশে কেবলমাত্রTuple<>
ডেটা-টাইপ প্রকারের ব্যবহারের জন্য ঘোষণা এড়াতে ব্যবহার করেছি । পরিস্থিতিটি এই সত্যটির সাথে জড়িত যে বেনামধারাযুক্ত জেনেরিক অভিধানগুলি ব্যবহার করার TryGetValue()
সময়, অভিধানে আইটেমগুলি সন্ধানের জন্য পদ্ধতিটি ব্যবহার করা কঠিন হয়ে পড়ে কারণ পদ্ধতির একটি out
পরামিতি প্রয়োজন যা নামকরণ করা যায় না:
public static class DictionaryExt
{
// helper method that allows compiler to provide type inference
// when attempting to locate optionally existent items in a dictionary
public static Tuple<TValue,bool> Find<TKey,TValue>(
this IDictionary<TKey,TValue> dict, TKey keyToFind )
{
TValue foundValue = default(TValue);
bool wasFound = dict.TryGetValue( keyToFind, out foundValue );
return Tuple.Create( foundValue, wasFound );
}
}
public class Program
{
public static void Main()
{
var people = new[] { new { LastName = "Smith", FirstName = "Joe" },
new { LastName = "Sanders", FirstName = "Bob" } };
var peopleDict = people.ToDictionary( d => d.LastName );
// ??? foundItem <= what type would you put here?
// peopleDict.TryGetValue( "Smith", out ??? );
// so instead, we use our Find() extension:
var result = peopleDict.Find( "Smith" );
if( result.First )
{
Console.WriteLine( result.Second );
}
}
}
PS অভিধানে বেনাম ধরণের থেকে উদ্ভূত সমস্যাগুলির আশেপাশের আরও একটি (সহজ) উপায় রয়েছে এবং তা হ'ল var
মূলশব্দটি আপনার জন্য সংকলকটি 'অনুমান' করতে দেয়। এই সংস্করণটি এখানে:
var foundItem = peopleDict.FirstOrDefault().Value;
if( peopleDict.TryGetValue( "Smith", out foundItem ) )
{
// use foundItem...
}