टपल को किस आवश्यकता को हल करने के लिए डिज़ाइन किया गया था?


94

मैं tuples की नई C # सुविधा को देख रहा हूं। मैं उत्सुक हूं कि टपल को हल करने के लिए क्या समस्या थी?

आपने अपने ऐप्स में tuples का क्या उपयोग किया है?

अपडेट करें

इस प्रकार उत्तर के लिए धन्यवाद, मुझे यह देखने दो कि क्या मेरे मन में कोई बात है। एक टुपल का एक अच्छा उदाहरण निर्देशांक के रूप में बताया गया है। क्या यह सही लगता है?

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

तो जैसे टुपल का उपयोग करें:

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

क्या वो सही है?



4
खैर, मैं दो जवाबों के बारे में सोच सकता हूं ...
दोपहर रेशम

13
यदि "समन्वय" की अवधारणा एक वर्ग के रूप में समझ में आती है तो मैं इसे एक वर्ग बनाऊंगा। जहां उन परिस्थितियों के लिए उपयोग tuples नहीं डेटा है कि एक प्रकार बनाने को सही ठहराते के सेट के लिए कुछ समझदार "व्यापार तर्क" अवधारणा।
एरिक लिपर्ट

13
निर्देशांक tuple का एक अच्छा उदाहरण नहीं हैं। C # में Tuple उन मामलों में केवल एक तदर्थ समाधान है जब आपको (एक फ़ंक्शन से) दो मान वापस करने होंगे। एक परिणाम प्रकार प्लस वन आउट पैरामीटर सेट करने के बजाय एक ट्यूपल वापस करने के लिए अधिक सुरुचिपूर्ण है। इस तरह आपको दूसरे पैरामीटर को पहले से घोषित करने की आवश्यकता नहीं है। C ++ में अंतर और भी अधिक स्पष्ट है (आप परिणाम में कमी कर सकते हैं, लेकिन आप आउट / रेफ पैरामीटर को कम नहीं कर सकते हैं)।
ग्रीनल्डमैन

8
क्योंकि अजगर के पास यह था, और अजगर के पास कुछ भी नहीं हो सकता है जो C # नहीं है;)
इवान प्लाइस

जवाबों:


117

प्रोग्राम लिखते समय तार्किक रूप से समूह को एक साथ मान देना बेहद सामान्य है जिसमें एक वर्ग बनाने के औचित्य के लिए पर्याप्त समानता नहीं है।

कई प्रोग्रामिंग भाषाएं आपको केवल एक ही प्रकार से टाइप किए बिना तार्किक रूप से एक दूसरे से संबंधित मानों के समूह के साथ अनुमति देती हैं:

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

तार्किक रूप से यह बिल्कुल एक विधि M के समान है जो एक तर्क लेता है जो कि int, string, double का 3-tuple है। लेकिन मुझे आशा है कि आप वास्तव में नहीं बनाएंगे:

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

जब तक कि व्यवसाय तर्क में MArguments का कोई और अर्थ नहीं था।

"समूह के एक समूह का एक साथ अन्यथा संरचना में अन्यथा संबंधित डेटा का एक गुच्छा जो एक वर्ग की तुलना में अधिक हल्का है" कई, कई स्थानों में उपयोगी है, न कि केवल तरीकों की औपचारिक पैरामीटर सूची के लिए। यह तब उपयोगी होता है जब किसी विधि में दो चीजें होती हैं, या जब आप एक के बजाय दो डेटा का शब्दकोश बंद करना चाहते हैं, और इसी तरह।

एफ # जैसी भाषाएं जो तुच्छ प्रकारों का समर्थन करती हैं, मूल रूप से अपने उपयोगकर्ताओं को लचीलेपन का एक बड़ा सौदा प्रदान करती हैं; वे डेटा प्रकारों का एक अत्यंत उपयोगी सेट हैं। BCL टीम ने F # टीम के साथ काम करने का फैसला फ्रेमवर्क के लिए एक ट्यूपल प्रकार पर मानकीकृत करने के लिए किया ताकि हर भाषा उनसे लाभान्वित हो सके।

हालाँकि, इस बिंदु पर C # में tuples के लिए कोई भाषा समर्थन नहीं है। ट्यूपल्स किसी अन्य फ्रेमवर्क क्लास की तरह एक अन्य डेटा प्रकार हैं; उनके बारे में कुछ खास नहीं है। हम सी # के काल्पनिक भविष्य के संस्करणों में ट्यूपल्स के लिए बेहतर समर्थन जोड़ने पर विचार कर रहे हैं। अगर किसी के पास इस बात का कोई विचार है कि आप किस प्रकार की विशेषताओं को शामिल करना चाहते हैं, तो मैं उन्हें डिजाइन टीम के साथ पारित करके खुश हूं। सैद्धांतिक परिदृश्यों की तुलना में यथार्थवादी परिदृश्य अधिक आश्वस्त हैं।


1
@ मैल्कम टकर: ऐश्रॉनि और समानता निश्चित रूप से हमारे दिमाग में समृद्ध क्षेत्रों के रूप में हैं जहां वास्तविक समस्याओं को हल करने के लिए भाषा उपकरण का उपयोग किया जा सकता है। मुझे नहीं लगता कि F # शैली अतुल्यकालिक वर्कफ़्लोज़ आवश्यक रूप से C # के लिए सबसे उपयुक्त हैं, लेकिन वे निश्चित रूप से प्रेरणादायक हैं।
एरिक लिपर्ट

60
जबकि टुपल्स उपयोगी हैं, एक बड़ी खामी स्पष्टता है। यह पढ़ सकते हैं और कोड को संदर्भित करता है समझने के लिए मुश्किल है Item1, Item2, आदि ... tuples कभी सी # में भाषा समर्थन प्राप्त करते हैं, यह अपने सदस्यों तरह से कि कोड की अनुमति देता है में नामित करने के लिए किया जा (या कम से कम एलियास) की अनुमति के लिए अद्भुत होगा कि का उपयोग करता है उन्हें और अधिक समझने के लिए। इस तरह के स्वच्छंद भविष्य में, मैं अलग-अलग मापदंडों (और इसके विपरीत) लेने के तरीकों के लिए कानूनी रूप में उचित "आकार" के ट्यूल को देखना पसंद करूंगा। तो, Tuple<int,string,bool>पारित किया जा सकता है M(int,string,bool)। यह ज्ञापन के तरीकों को बहुत आसान बना देगा।
LBushkin

2
ये "ट्यूपल" मूल रूप से अनाम सदस्यों के साथ सभी प्रकार के public, अनाम struct प्रकार हैं । मैं इसके बजाय प्रोग्रामर structको नामांकित सदस्यों के साथ लिखूंगा और वापस लौटूंगा, इससे निपटने के लिए tupleमुझे अपने सदस्यों के शब्दार्थ के बारे में कुछ भी नहीं बताना है।
बोबोबो

1
@ हाय-एंजेल: तर्क इस बात पर नहीं है कि टपल के रूप में क्या गिना जाता है और क्या नहीं करता है, बल्कि इसके बारे में है कि उन विशेषताओं का क्या सेट है जो आधुनिक लाइन-ऑफ-बिजनेस डेवलपर्स अपनी उत्पादकता बढ़ाने के लिए उपयोग कर सकते हैं । LBushkin एक विशेषता अनुरोध व्यक्त कर रहा है कि डिज़ाइन टीम हर समय सुनती है: किसी प्रकार की परेशानी और खर्च के बिना किसी प्रकार का "रिकॉर्ड प्रकार" बनाने की इच्छा पूरी कक्षा को बस कुछ क्षेत्रों को एक साथ रखने के लिए। सी # में पहले से ही यह सुविधा है; इसे "पैरामीटर सूची" कहा जाता है।
एरिक लिपर्ट

2
@ हाय-एंजेल: आप शायद तर्क नहीं करेंगे "यदि आप नाम से अपने विधि मापदंडों का उपयोग करना चाहते हैं तो आपको एक अलग वर्ग बनाना चाहिए" क्योंकि यह बहुत भारी लगता है, लेकिन यह केवल इसलिए भारी लगता है क्योंकि हमें इसका उपयोग करने की आदत है। किसी विधि को कॉल करते समय मनमाने प्रकार और नामों के साथ मनमाने ढंग से चर का एक सेट एक साथ बाँधने की क्षमता । कल्पना कीजिए कि किसी भी भाषा में वह विशेषता नहीं थी; हर विधि केवल एक तर्क ले सकती है, और यदि आप दो पास करना चाहते हैं, तो आपको एक प्रकार बनाना होगा और उसका एक उदाहरण देना होगा।
एरिक लिपर्ट

22

टुपल्स एक संग्रह का एक अपरिवर्तनीय कार्यान्वयन प्रदान करते हैं

टुपल्स के सामान्य उपयोगों के अलावा:

  • एक वर्ग बनाने के बिना एक साथ सामान्य मूल्यों को समूहित करना
  • फ़ंक्शन / विधि से कई मान वापस करने के लिए
  • आदि...

अपरिवर्तनीय वस्तुएं स्वाभाविक रूप से सुरक्षित हैं:

बहु-थ्रेडेड अनुप्रयोगों में अपरिवर्तनीय वस्तुएँ उपयोगी हो सकती हैं। एकाधिक थ्रेड्स डेटा पर कार्य कर सकते हैं जो अन्य थ्रेड द्वारा परिवर्तित किए जा रहे डेटा की चिंता किए बिना अपरिवर्तनीय वस्तुओं द्वारा दर्शाए गए हैं। अपरिवर्तनीय वस्तुओं को इसलिए उत्परिवर्तित वस्तुओं की तुलना में अधिक सुरक्षित माना जाता है।

से "अपरिवर्तनीय ऑब्जेक्ट" विकिपीडिया पर


प्रश्न में अतिरिक्त जानकारी जोड़ने के लिए धन्यवाद। बहुत सराहना की।
चाडडियस

यदि आप एक अपरिवर्तनीय संग्रह चाहते हैं, तो आपको एक अपरिवर्तनीय संग्रह का उपयोग करना चाहिए, न कि टपल का। अंतर यह है कि अधिकांश अपरिवर्तनीय संग्रहों के लिए आपको संकलन-समय पर तत्वों की संख्या निर्दिष्ट करने की आवश्यकता नहीं है
ब्लूराजा - डैनी पीफ्लुघोफ्ट

@ BlueRaja-DannyPflughoeft जब मैंने यह उत्तर लिखा तो C # अपरिवर्तनीय संग्रह कक्षाएं अभी भी BCL में उपलब्ध नहीं थीं। लगता है कि मैं 'संग्रह' को 'ऑब्जेक्ट' में बदल दूंगा क्योंकि एमएस ने सी # में टपल कार्यान्वयन को रोक दिया
इवान

12

यह एक विकल्प प्रदान करता है refया outयदि आपके पास एक ऐसी विधि है जो इसके जवाब के हिस्से के रूप में कई नई वस्तुओं को वापस करने की आवश्यकता है।

यह आपको एक अंतर्निहित प्रकार का उपयोग रिटर्न प्रकार के रूप में भी करने की अनुमति देता है यदि आपको केवल दो या तीन मौजूदा प्रकारों को मैश करना है, और आप इस संयोजन के लिए सिर्फ एक वर्ग / संरचना जोड़ना नहीं चाहते हैं। (कभी इच्छा है कि कोई फ़ंक्शन एक अनाम प्रकार लौटा सकता है? यह उस स्थिति का आंशिक उत्तर है।)


अरे नहीं। अच्छा लगा। मेरी इच्छा है कि मैंने कुछ वर्षों पहले क्या-क्या किया है।
साबीलैंड

10

यह अक्सर एक "जोड़ी" प्रकार के लिए सहायक होता है, बस त्वरित स्थितियों में उपयोग किया जाता है (जैसे एक विधि से दो मान वापस करना)। Tuples F # जैसी कार्यात्मक भाषाओं का एक केंद्रीय हिस्सा है, और C # ने उन्हें रास्ते से उठाया।


System.Web.UI में एक जोड़ी वर्ग msdn.microsoft.com/en-us/library/system.web.ui.pair.aspx है
स्टिंगजैक


4

व्यक्तिगत रूप से, मुझे लगता है कि जब आप एक खोजी चक्र में या सिर्फ "खेल" रहे हैं, तो टुपल्स को विकास का एक पुनरावृत्ति वाला हिस्सा लगता है। चूँकि एक Tuple जेनेरिक है, मैं सामान्य पैरामीटर के साथ काम करते समय इसके बारे में सोचता हूँ - विशेषकर जब कोड का जेनेरिक टुकड़ा विकसित करना चाहता हूँ, और मैं कोड अंत में शुरू कर रहा हूँ, इसके बजाय खुद से पूछ रहा हूँ "मुझे यह कॉल कैसा लगेगा देखने के लिए?"।

अक्सर मुझे एहसास होता है कि संग्रह जो टुपल फॉर्म एक सूची का हिस्सा बन जाता है, और सूची> पर घूरना वास्तव में सूची के इरादे को व्यक्त नहीं करता है, या यह कैसे काम करता है। मैं अक्सर इसके साथ "लाइव" करता हूं, लेकिन खुद को सूची में हेरफेर करना चाहता हूं, और एक मूल्य बदलना चाहता हूं - जिस बिंदु पर, मैं जरूरी नहीं कि इसके लिए एक नया टपल बनाना चाहता हूं, इस प्रकार मुझे अपना खुद का वर्ग या संरचना बनाने की आवश्यकता है इसे धारण करने के लिए, इसलिए मैं हेरफेर कोड जोड़ सकता हूं।

बेशक, वहाँ हमेशा विस्तार के तरीके हैं - लेकिन अक्सर आप सामान्य कार्यान्वयन के लिए उस अतिरिक्त कोड का विस्तार नहीं करना चाहते हैं।

कई बार मैं एक टुपल के रूप में डेटा व्यक्त करना चाहता हूं, और टुपल्स उपलब्ध नहीं थे। (VS2008) जिस स्थिति में मैंने सिर्फ अपना टपल क्लास बनाया है - और मैं इसे थ्रेड सेफ (अपरिवर्तनीय) नहीं बनाता।

इसलिए मुझे लगता है कि मुझे लगता है कि ट्यूपल्स एक प्रकार का नाम खोने के खर्च पर आलसी प्रोग्रामिंग कर रहे हैं जो इसका उद्देश्य है। अन्य खर्च यह है कि आपको टपल के हस्ताक्षर की घोषणा करनी होगी जहां भी इसे एक पैरामीटर के रूप में उपयोग किया जाता है। कई तरीकों के बाद जो फूला हुआ दिखना शुरू होता है, आपको लग सकता है जैसे मैं करता हूं, कि यह एक वर्ग बनाने के लायक है, क्योंकि यह विधि हस्ताक्षर को साफ करता है।

जिस कक्षा में आप पहले से ही काम कर रहे हैं, उसके एक सार्वजनिक सदस्य के रूप में मैं क्लास शुरू करना शुरू कर देता हूँ। लेकिन जिस क्षण यह मूल्यों के संग्रह से आगे निकलता है, यह उसकी खुद की फ़ाइल हो जाती है, और मैं इसे क्लास से बाहर कर देता हूँ।

तो पूर्वव्यापी में, मेरा मानना ​​है कि मैं ट्यूपल्स का उपयोग करता हूं जब मैं बंद नहीं करना चाहता हूं और एक कक्षा लिखता हूं, और अभी जो मैं अभी लिख रहा हूं उसके बारे में सोचना चाहता हूं। इसका मतलब है कि पाठ के हस्ताक्षर आधे घंटे में काफी बदल सकते हैं, जबकि मुझे पता है कि मुझे इस पद्धति के लिए कौन से डेटा की आवश्यकता है, और यह कैसे वापस आ रहा है, जो कभी भी मूल्यों पर लौटता है।

अगर मुझे कोड को रीफैक्टर करने का मौका मिलता है, तो अक्सर मैं इसमें टपल की जगह पर सवाल उठाऊंगा।


3

2010 से पुराना सवाल, और अब 2017 में डॉटनेट बदलता है और अधिक स्मार्ट बन जाता है।

सी # 7 ट्यूपल्स के लिए भाषा समर्थन का परिचय देता है, जो नए, अधिक कुशल ट्यूपल प्रकारों का उपयोग करके ट्यूपल के क्षेत्रों के लिए शब्दार्थ नाम सक्षम करता है।

बनाम 2017 और .Net 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

जब आप किसी विशिष्ट प्रकार का निर्माण नहीं करना चाहते हैं, तो अक्सर कार्यों से कई मान लौटाने के लिए एक Tuple का उपयोग किया जाता है। यदि आप पायथन से परिचित हैं, तो पायथन ने लंबे समय से ऐसा किया है।


1

किसी फ़ंक्शन से एक से अधिक मान लौटाता है। अगर यह सिर्फ x या y या z देता है, तो getCoordinates () बहुत उपयोगी नहीं है, लेकिन एक पूर्ण वर्ग और ऑब्जेक्ट को तीन इन्ट्स रखने के लिए बनाना बहुत भारी लगता है।


1

एक सामान्य उपयोग उन वर्गों / संरचनाओं को बनाने से बचने के लिए हो सकता है जिनमें केवल 2 फ़ील्ड हैं, इसके बजाय आप एक Tuple (या अब के लिए एक KeyValuePair) बनाते हैं। वापसी मूल्य के रूप में Usefull, पास आउट N से बचने के लिए ...


0

मुझे लगता है कि KeyValuePair रीफ़्रेश हो रहा है C # को शब्दकोश में मुख्य मान वाले जोड़े पर पुनरावृति करने के लिए।


KeyValuePairविशेष प्रयोजन के समाधान के रूप में देखा जा सकता है। पाइथन में, dictबस रिटर्न (कुंजी, मूल्य) ट्यूपल्स पर पुनरावृति होती है ।
dan04

हाँ, अजगर की तरह। :-) मुझे पता नहीं था कि KeyValuePair in c # एक tuple नहीं था?
जुब्बल

0

कार्यों से मूल्यों को वापस करते समय यह वास्तव में उपयोगी है। हमारे पास कई मान हो सकते हैं और यह कुछ परिदृश्यों में काफी सुरक्षित है।


0

मैं ट्यूपल्स और की-वैल्यू जोड़े के बीच इस प्रदर्शन बेंचमार्क पर ठोकर खाई और शायद आपको यह दिलचस्प लगेगा। सारांश में, यह कहता है कि टपल का फायदा है क्योंकि यह एक वर्ग है, इसलिए इसे ढेर में संग्रहीत किया जाता है, न कि स्टैक में और जब तर्क के रूप में पास किया जाता है तो इसका सूचक केवल एक चीज है जो जा रहा है। लेकिन KeyValuePair एक स्ट्रक्चर्स है इसलिए इसे आबंटित करना तेज़ है लेकिन इसका उपयोग करने पर यह धीमा होता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.