টিউপলটি কী সমাধান করার জন্য ডিজাইন করা হয়েছিল?


94

আমি টিপলসের নতুন সি # বৈশিষ্ট্যটি দেখছি। আমি কৌতুহলী, টিপলটি কোন সমস্যার সমাধানের জন্য ডিজাইন করা হয়েছিল?

আপনি আপনার অ্যাপ্লিকেশনগুলিতে টুপলগুলি কী ব্যবহার করেছেন?

হালনাগাদ

এতদূর উত্তরগুলির জন্য ধন্যবাদ, আমার মনের বিষয়গুলি সোজাসুজি আছে কিনা তা আমাকে দেখতে দিন। টিউপলের একটি ভাল উদাহরণ স্থানাঙ্ক হিসাবে চিহ্নিত করা হয়েছে। এটা কি ঠিক দেখাচ্ছে?

var coords = Tuple.Create(geoLat,geoLong);

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

var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");

এটা কি ঠিক?



4
ঠিক আছে, আমি দুটি উত্তর সম্পর্কে ভাবতে পারি ...
দুপুর সিল্ক

13
"সমন্বয়" ধারণাটি যদি শ্রেণি হিসাবে উপলব্ধি করে তবে আমি এটিকে একটি শ্রেণি হিসাবে তৈরি করব। যেখানে আছে সেই পরিস্থিতিতে জন্য আপনি এই ব্যবহারটি tuples না এমন ডেটা রয়েছে যা একটি টাইপ উপার্জন উভয়প্রান্তে সারিবদ্ধ সেট এর জন্য কিছু যুক্তিসম্মত "বাণিজ্যিক নীতি" ধারণা।
এরিক লিপার্ট

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

8
কারণ অজগরটি এটি ছিল এবং অজগরের সি # তে থাকা কিছুই থাকতে পারে না;)
ইভান প্লেস

উত্তর:


117

প্রোগ্রাম লেখার সময় এটি যৌক্তিকভাবে মানগুলির একটি সেটকে একত্রিত করতে চাওয়া অত্যন্ত সাধারণ বিষয় যা শ্রেণি তৈরির ন্যায্যতা প্রমাণ করার পক্ষে পর্যাপ্ত সাধারণতা নেই।

অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজ আপনাকে যুক্তিযুক্তভাবে কেবলমাত্র এক উপায়ে প্রকার তৈরি না করে অন্যথায় সম্পর্কযুক্ত মানগুলির সেটকে যৌক্তিকভাবে একত্রিত করার অনুমতি দেয়:

void M(int foo, string bar, double blah)

যৌক্তিকভাবে এটি হ'ল একটি পদ্ধতি এম এর মতো যা একটি আর্গুমেন্ট গ্রহণ করে যা 3 টি-ইন-স্ট্রিং, স্ট্রিং, ডাবল। তবে আমি আশা করি আপনি আসলে এটি তৈরি করবেন না:

class MArguments
{
   public int Foo { get; private set; } 
   ... etc

যদি না ম্যারাগমেন্টগুলির ব্যবসার যুক্তিতে কিছু অন্য অর্থ থাকে।

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

এফ # এর মতো ভাষা যা স্থানীয়ভাবে তাদের বিভিন্ন ধরনের সমর্থন করে তাদের ব্যবহারকারীদের জন্য প্রচুর নমনীয়তা সরবরাহ করে; এগুলি ডেটা ধরণের একটি অত্যন্ত দরকারী সেট। ছাত্রলীগ টিম কাঠামোর জন্য একটি টিপল ধরণের মানকে মানিক করার জন্য এফ # টিমের সাথে কাজ করার সিদ্ধান্ত নিয়েছে যাতে প্রতিটি ভাষা তাদের কাছ থেকে উপকৃত হয়।

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


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

60
যখন টিউপসগুলি কার্যকর, তবে একটি বড় অসুবিধা হ'ল স্বচ্ছতা। এটা পড়তে এবং কোড যে বোঝায় বোঝা কঠিন Item1, Item2, ইত্যাদি ... tuples কি কখনো C # ভাষা সমর্থন অর্জন করেন, তাহলে এটা তাদের সদস্যদের পদ্ধতিতে যে কোড পারবেন নাম করা (অথবা অন্তত ওরফে) করার অনুমতি বিস্ময়কর হতে হবে ব্যবহারসমূহ তাদের আরও বোধগম্য হতে হবে। এই ধরনের জলবিদ্যুত ভবিষ্যতে, আমি পৃথক পরামিতিগুলি (এবং তদ্বিপরীত) গ্রহণ পদ্ধতিগুলির আইনি প্যারাম হিসাবে উপযুক্ত "আকৃতির" টিপলগুলি দেখতেও পছন্দ করব। সুতরাং, Tuple<int,string,bool>পাস করা যেতে পারে M(int,string,bool)। এটি মেমোজাইজিং পদ্ধতিগুলি আরও সহজ করে তুলবে।
এল বুশকিন

4
এই "টিপলস" মূলত সমস্ত publicঅ্যাক্সেস, নামবিহীন সদস্যদের সাথে বেনামে struct প্রকার । আমি বরং প্রোগ্রামারকে নামযুক্ত সদস্যদের সাথে একটি লিখতে এবং ফিরিয়ে দিতে চাই, যা তার সদস্যদের শব্দার্থ সম্পর্কে আমাকে কিছু না বলে এমন একটি বিষয় মোকাবেলা করার চেয়ে । structtuple
বোবোবোবো

4
@ হাই-অ্যাঞ্জেল: যুক্তিটি টিউপল হিসাবে কী গণনা করা হয় এবং কী না তা নিয়ে দ্বিধাদ্বন্দ্ব করার বিষয়টি নয়, বরং আধুনিক লাইন অফ বিজনেস বিকাশকারীরা তাদের উত্পাদনশীলতা বাড়াতে যে বৈশিষ্ট্যগুলি ব্যবহার করতে পারে সেগুলি সম্পর্কে কী বলা যায় । এল বুশকিন একটি বৈশিষ্ট্য অনুরোধ প্রকাশ করছে যে ডিজাইন দলটি সর্বদা শুনবে: কেবলমাত্র কয়েকটি ক্ষেত্রকে একসাথে রাখার জন্য পুরো শ্রেণি তৈরি করার ঝামেলা এবং ব্যয় ছাড়াই কোনও ধরণের "রেকর্ড টাইপ" তৈরির আকাঙ্ক্ষা। সি # এর ইতিমধ্যে পদ্ধতিগুলির জন্য এই বৈশিষ্ট্যটি রয়েছে; এটিকে "প্যারামিটার তালিকা" বলা হয়।
এরিক লিপার্ট

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

22

টিপলস কোনও সংগ্রহের একটি অপরিবর্তনীয় বাস্তবায়ন সরবরাহ করে

টিপলসের সাধারণ ব্যবহারগুলি বাদে:

  • ক্লাস তৈরি না করে একসাথে সাধারণ মানগুলিকে একত্রিত করতে
  • একটি ফাংশন / পদ্ধতি থেকে একাধিক মান ফেরত
  • ইত্যাদি ...

অপরিবর্তনীয় বস্তুগুলি মূলত থ্রেডটি নিরাপদ:

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

থেকে "অপরিবর্তনীয় অবজেক্ট" উইকিপিডিয়ায়


প্রশ্নের অতিরিক্ত তথ্য যুক্ত করার জন্য আপনাকে ধন্যবাদ। অনেক প্রশংসিত.
চাদ্দিউস

আপনি যদি একটি অপরিবর্তনীয় সংগ্রহ চান তবে আপনার টিউপল নয়, অপরিবর্তনীয় সংগ্রহ ব্যবহার করা উচিত। পার্থক্যটি হল সবচেয়ে অপরিবর্তনীয় সংগ্রহের জন্য আপনাকে সংকলন-সময়ে উপাদানগুলির সংখ্যা নির্দিষ্ট করতে হবে না
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

@ ব্লুরাজা-ড্যানিপ্লুঘুফুট ফিরে যখন আমি এই উত্তরটি লিখেছিলাম তখন সি # অপরিবর্তনীয় সংগ্রহের ক্লাসগুলি এখনও ছাত্রলীগে পাওয়া যায় নি। এমএস সি #
ইভান প্লেস

12

এটি বিকল্প সরবরাহ করে refবা outআপনার কাছে এমন কোনও পদ্ধতি রয়েছে যা এর প্রতিক্রিয়ার অংশ হিসাবে একাধিক নতুন অবজেক্ট ফেরত দিতে হবে।

এটি আপনাকে বিল্ট-ইন টাইপটি রিটার্ন টাইপের হিসাবে ব্যবহার করতে দেয় যদি আপনার দুটি বা তিনটি বিদ্যমান ধরণের ম্যাস আপ করতে হয় এবং কেবল এই সংমিশ্রণের জন্য আপনাকে কোনও শ্রেণি / কাঠামো যুক্ত করতে চান না। (কখনও কখনও কোনও ফাংশন কোনও বেনামি প্রকারটি ফিরিয়ে আনতে চাইবে? এটি এই পরিস্থিতির একটি আংশিক উত্তর))


জঘন্য। ভাল লাগল আমি আশা করি আমি কয়েক বছর আগে কি-টিপলসগুলি পরীক্ষা করেছি;)।
সাবিল্যান্ড

10

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


System.Web.UI একজোড়া বর্গ হয়েছে msdn.microsoft.com/en-us/library/system.web.ui.pair.aspx
স্টিঙ্গি জ্যাক


4

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

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

অবশ্যই, সর্বদা এক্সটেনশন পদ্ধতি রয়েছে - তবে প্রায়শই আপনি জেনেরিক প্রয়োগগুলিতে অতিরিক্ত কোডটি প্রসারিত করতে চান না।

এমন অনেক সময় হয়েছে যখন আমি টিপল হিসাবে ডেটা প্রকাশ করতে চেয়েছিলাম, এবং টুপলস উপলব্ধ ছিল না। (VS2008) সেক্ষেত্রে আমি স্রেফ আমার নিজস্ব টিপল ক্লাস তৈরি করেছি - এবং আমি এটি থ্রেডকে নিরাপদ (অপরিবর্তনীয়) করব না।

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

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

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

যদি আমি রিফ্যাক্টর কোড করার সুযোগ পাই, তবে প্রায়শই আমি এটিতে একটি টিপল এর জায়গা নিয়ে প্রশ্ন করব।


3

২০১০ সাল থেকে পুরানো প্রশ্ন এবং এখন 2017 সালে ডটনেট পরিবর্তন হয় এবং আরও স্মার্ট হয়।

সি # 7 টিউপলসের জন্য ভাষা সমর্থন উপস্থাপন করে, যা নতুন, আরও দক্ষ টিউপল প্রকারগুলি ব্যবহার করে একটি টিপলের ক্ষেত্রগুলির জন্য অর্থপূর্ণ নামগুলিকে সক্ষম করে।

বনাম 2017 এবং। নেট 4.7 (বা নুগেট প্যাকেজ সিস্টেম ইনস্টল করে।

     var person = (Id:"123", Name:"john"); //create tuble with two items
     Console.WriteLine($"{person.Id} name:{person.Name}") //access its fields

একটি পদ্ধতি থেকে একাধিক মান প্রত্যাবর্তন:

    public (double sum, double average) ComputeSumAndAverage(List<double> list)
    {
       var sum= list.Sum();
        var average = sum/list.Count;
        return (sum, average);
    }

    How to use:

        var list=new List<double>{1,2,3};
        var result = ComputeSumAndAverage(list);
        Console.WriteLine($"Sum={result.sum} Average={result.average}");    

আরও বিশদে পড়ুন: https://docs.microsoft.com/en-us/dotnet/csharp/tuples


1

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


1

একটি ফাংশন থেকে একাধিক মান প্রত্যাবর্তন। getCoordinates () খুব কার্যকর হয় না যদি এটি কেবল x বা y বা z প্রদান করে তবে একটি সম্পূর্ণ শ্রেণি তৈরি এবং তিনটি অন্তর্নির্মিত বস্তু তৈরি করাও বেশ ভারী বলে মনে হয়।


1

একটি সাধারণ ব্যবহার হতে পারে এমন ক্লাস / স্ট্রাক্ট তৈরি করা এড়ানো যাতে কেবল 2 টি ক্ষেত্র থাকে, পরিবর্তে আপনি একটি টিপল তৈরি করেন (বা এখনের জন্য একটি কীভ্যালিউপিয়ার)। রিটার্ন মান হিসাবে ব্যবহারযোগ্য, এন পাসওয়ার্ডগুলি এড়িয়ে চলুন ...


0

আমি একটি অভিধানে মূল মান জোড়গুলির পুনরাবৃত্তি করতে সি # তে কীভ্যালিউ পেয়ার রিফ্রেশ পেয়েছি।


KeyValuePairবিশেষ উদ্দেশ্যে কাজ হিসাবে দেখা যেতে পারে। পাইথনে, dictকেবলমাত্র রিটার্ন (কী, মান) টিপলস দিয়ে পুনরাবৃত্তি করা ।
dan04

হ্যাঁ, পাইথনের মতো। :-) আমি জানতাম না যে সি # তে কীভ্যালু পেয়ার টিপল নয়?
যুবল

0

ফাংশন থেকে মানগুলি ফেরত দেওয়ার সময় এটি সত্যই সহায়ক। আমরা একাধিক মান ফিরে পেতে পারি এবং এটি কিছু পরিস্থিতিতে দৃ a়রূপে সেভার।


0

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

http://www.dotnetperls.com/tuple-keyvaluepair

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.