जब एक KeyValuePair बनाम टपल का उपयोग करना बेहतर होता है?


90

KeyValuePair<TKey,TValue>जब भी मेरे पास डेटा होता है, तो मैं आमतौर पर उस प्रकार का उपयोग करता हूं जो इस अर्थ में युग्म-संबंधी है कि एक दूसरे के लिए महत्वपूर्ण है। यदि डेटा असंबंधित है, तो Tuple<T1,T2>टाइप अधिक समझ में आता है और मैं उसके साथ जाऊंगा।

अब मैं सिर्फ इस लेख को पढ़ता हूं कि आम तौर पर क्यों बचें KeyValuePair<TKey,TValue>और पसंद करें Tuple<T1,T2>। प्राथमिक तर्क का प्रदर्शन लाभ है Tuple<T1,T2>

बाहरी प्रदर्शन, क्या कोई कारण है कि केवीपी एक से बेहतर विकल्प होगा Tuple<T1,T2>?


4
A KeyValuePairएक कुंजी और एक मान है, एक समान मूल्यों Tuple<T1,T2>की एक जोड़ी है । आप यह भी पूछ सकते हैं: "मुझे क्यों उपयोग करना चाहिए अगर मैं उपयोग कर सकता हूं "। List<Class>Dictionary<A,B>
टिम शिल्टर

4
सही है, लेकिन उस स्थिति में आप डेटा देखने के लिए कुंजी का उपयोग कर सकते हैं। इसका मतलब कुछ है। इस मामले में, नाम सिर्फ शब्दार्थ हैं, उनका मतलब कुछ भी नहीं है (प्रोसेसर के लिए।)
निक गॉच

1
एक टपल बराबर मानों की एक जोड़ी नहीं है, लेकिन कुछ समान प्रकारों की संख्या है। हो सकता है कि इसे नाइटपैकिंग के रूप में देखा जाता है, लेकिन उदाहरण के लिए C में समान मूल्यों के विभिन्न अभ्यावेदन के लिए संघ निर्माण है। :)
जोनास 14

जवाबों:


65

खैर, एक के लिए, प्रकार खराब माना जा सकता है। नाम के रूप में एक KeyValuePair एक कुंजी और एक मूल्य का प्रतिनिधित्व करना चाहिए। क्या होगा यदि आपकी दो वस्तुएं वास्तव में एक कुंजी और मूल्य नहीं हैं, बस दो चीजें? यदि मुझे एक ऐसी विधि या संपत्ति दिखती है जिसमें एक प्रकार का है KeyValuePair<TKey, TValue>, तो मैं केवीपी के मूल्यों को एक कुंजी और एक मूल्य होने की उम्मीद करूंगा। यह वास्तव में केवल इरादे को संप्रेषित करने और भविष्य में खुद को या संभवतः टीम के अन्य सदस्यों को स्पष्ट करने का मामला है। एक टपल उस तरह के जुड़ाव को इंगित नहीं करता है।

ट्यूपल्स ने एक और मूल्य जोड़ना भी आसान बना दिया है, जिससे यह 3-ट्यूपल (या ट्रिपलेट) हो जाता है, हालांकि आप इसे कॉल करना चाहते हैं)। कुछ .NET भाषाओं, जैसे F #, के साथ-साथ टुपल्स के आसपास विशेष वाक्यविन्यास है

कार्यान्वयन के दृष्टिकोण के लिए, Tupleकई चीजें KeyValuePairनहीं करती हैं। टुपल्स तुलनीय हैं, वे लागू करते हैं IComparableऔर IStructuralEquatableइंटरफेस करते हैं, इसलिए यह दो टुपल्स की तुलना करना आसान बनाता है।


1
मुझे पता चला कि आप KeyValuePairs को एक शब्दकोश में डाल सकते हैं, लेकिन फिर कभी भी परिणाम नहीं मिलेगा।
MKesper

3
इसके अलावा, नया C # 7.0 Tuples के लिए नए, सरल सिंटैक्स का समर्थन करता है, जिससे उन्हें KeyValuePairs की तुलना में काम करने में बहुत आसान और अच्छा प्रदर्शन होता है। visualstudiomagazine.com/articles/2017/01/01/…
जैकब स्टैम

1
इसके अलावा, टुपल्स में मापदंडों का नाम रखने की क्षमता उपभोक्ता के लिए यह समझना आसान बनाती है कि वे क्या उपयोग करने वाले हैं। KVP की तरह एक सामान्य में, यह वास्तव में किसी का अनुमान है - जब तक कि यह विशेष रूप से कहीं दस्तावेज नहीं है - कुंजी को "होना" माना जाता है - अर्थात इसका प्रकार नहीं है लेकिन यह वास्तविक दुनिया की चीज क्या है, जैसे सेटिंग नाम, एक सामाजिक सुरक्षा संख्या, आदि
rory.ap

40

KeyValuePairएक संरचना है और Tupleएक वर्ग है।

वह मुख्य अंतर है जो प्रभावित करता है कि वस्तुओं को संदर्भ या मूल्यों द्वारा कैसे कॉपी किया जाता है।

और इसलिए Tuple<T1,T2>जब 32 बिट OS में "4byte" का उपयोग किया जाता है, जबकि KeyValuePair<K,V>"K और V" के आधार पर अधिक आवश्यकता होती है

किसी भी तरह से Tuple और KeyValuePair की तुलना करना एक अच्छा विचार नहीं है (मेरे लिए कोई मतलब नहीं है) क्योंकि दोनों अलग-अलग उद्देश्य से कार्य करते हैं।


2
वे एक अलग उद्देश्य की सेवा कैसे करते हैं? क्या आप इसके बारे में विस्तार से बता सकते हैं।
ओल्डस्कूल में

1
@YRRangi keyvaluepair का उपयोग एक शब्दकोश में कुंजियों और मूल्यों के लिए एक कंटेनर के रूप में किया जाना है, अन्यथा इसका कोई उद्देश्य नहीं है। दूसरी ओर टपल का उपयोग किसी भी संबंधित सदस्य को एक साथ स्टोर करने के लिए किया जा सकता है। इसके अलावा टपल साथ आप स्टोर कर सकते हैं कई सदस्यों संयुक्त न सिर्फ 2.
श्रीराम शक्तिवेल

@SriramSakthivel इसका मतलब है, ओपी प्रश्न का उत्तर है: KVP का उपयोग न करें, जब तक कि आप एक शब्दकोश ब्राउज़ नहीं कर रहे हैं।
एलेक्स फेनशेटिन

23

शब्दार्थ के बावजूद, प्रदर्शन एक महत्वपूर्ण विचार हो सकता है क्योंकि आप दोनों विकल्पों पर विचार करते हैं। जैसा कि पहले उल्लेख किया गया KeyValuePairहै, एक मूल्य प्रकार (संरचना) है, जबकि Tuple<>एक संदर्भ प्रकार (वर्ग) है। इसलिए, KeyValuePairस्टैक Tuple<>पर आवंटित किया जाता है और ढेर पर आवंटित किया जाता है, और इष्टतम विकल्प आमतौर पर स्टैक बनाम हीप मेमोरी आवंटन के क्लासिक तर्कों द्वारा निर्धारित किया जाता है । संक्षेप में, स्टैक स्पेस सीमित है, लेकिन आम तौर पर बहुत तेज़ पहुंच है। ढेर स्मृति बहुत बड़ी है, लेकिन कुछ धीमी है।

KeyValuePair<T1, T2>अगर दोनों कुंजी और मान प्रकार पुरातन (मूल्य प्रकार चाहते हैं बेहतर विकल्प हो सकता है int, bool, double, आदि) या छोटे आकार की structs। स्टैक पर आदिम प्रकारों के साथ, आवंटन और निपटारा तेजी से बिजली कर रहा है। यह वास्तव में प्रदर्शन को प्रभावित कर सकता है, विशेष रूप से पुनरावर्ती विधि कॉल के तर्क के रूप में।

दूसरी ओर, Tuple<T1, T2>संभावना है, तो या तो बेहतर विकल्प है T1या T2संदर्भ प्रकार (वर्ग) की तरह कर रहे हैं। ए KeyValuePairमें पॉइंटर्स टू रेफरेंस टाइप्स (जैसे की या वैल्यू टाइप्स) होते हैं, उद्देश्य को हरा देता है क्योंकि ऑब्जेक्ट्स को वैसे भी ढेर पर देखना होगा।

यहाँ एक बेंचमार्क है जो मुझे ऑनलाइन मिला: टपल बनाम कीवैल्यूएयर । इस बेंचमार्क के साथ एकमात्र समस्या यह है कि उन्होंने KeyValuePair<string, string>बनाम परीक्षण किया Tuple<string, string>, और stringप्रकार .NET में एक असामान्य और विशेष प्रकार है। यह निष्पादन के संदर्भ के आधार पर मूल्य प्रकार और / या संदर्भ प्रकार दोनों का व्यवहार कर सकता है। मेरा मानना ​​है कि के KeyValuePair<int, int>खिलाफ एक स्पष्ट विजेता रहा होगा Tuple<int, int>। हालांकि, कमियों के साथ भी, परिणाम बताते हैं कि प्रदर्शन अंतर महत्वपूर्ण हो सकते हैं:

8.23 ns - आवंटन Tuple
0.32 ns - KeyValuePair आवंटित करें (25x तेज़ी से!)

1.93 ns - तर्क के रूप में टुपल पास करें
2.57 ns - तर्क के रूप में KeyValuePair पास करें

1.91 ns - रिटर्न टपल
6.09 ns - KeyValuePair रिटर्न

2.79 ns - सूची से लोड टपल को
4.18 ns - सूची से KeyValuePair लोड करें


0

आपका वास्तव में गलत प्रश्न पूछना उचित प्रश्न एक क्लास (टपल) का उपयोग कर रहा है _ एक संरचना (केवीपी) से बेहतर है जिस स्थिति में उत्तर है कि आप उनके लिए क्या उपयोग करना चाहते हैं और इसका जवाब यहां दिया गया है संरचना बनाम कक्षाएं।


2
उसने सही सवाल पूछा। किस प्रश्न का उपयोग बेहतर है, यह स्पष्ट रूप से निहित है।
ग्रेग

@ सवाल यह है कि कौन सा बेहतर चॉकलेट या सोडा है, हालांकि विशिष्ट प्रश्न व्यर्थ है और बेहतर भोजन और पेय पर एक सामान्य प्रश्न के रूप में संबोधित किया जाता है
माइक

3
डिफैक्टो प्रश्न "मुझे टुपल्स बनाम कीपेयर का उपयोग कब करना चाहिए?"। एक वैध प्रश्न है। मुझे लगता है कि आप सिर्फ "बेहतर" शब्द के शब्दार्थ पर अड़े हुए हैं।
ग्रेग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.