2012-03-22 14 views
5

मैं कुछ कोड मेरे सह कार्यकर्ता में जाँच देख रहा था, तो वह ऐसा देखा:.Net शब्दकोश ऐसा क्यों दिखता है जैसा सॉर्ट किया गया है?

return list.OrderBy(item => item.Order).ToDictionary(item => item.Id); 

मैं तुरंत अपने सह कार्यकर्ता अपने कोड एक गैर,, गलत है क्योंकि Dictionary एक हैश तालिका है बताया भंडारित संग्रह। मुझे या तो ऑर्डर-संरक्षित संग्रह का उपयोग करना चाहिए, या बाद में आइटम को सॉर्ट करना चाहिए क्योंकि वह उन्हें foreach के साथ शब्दकोश से पढ़ता है।

लेकिन उसने जवाब दिया "नहीं, नहीं, मेरा कोड सही है! देखो: अब मैंने OrderBy जोड़ा है, आइटम सही क्रम में दिखाई देते हैं।"

परीक्षण मामले पर, बाहर निकलता है, वह सही था। मैंने कुछ अन्य डेटा पर कोशिश की, लेकिन यह अभी भी पूरी तरह से हल किया गया था!

मैंने उनसे कहा कि उन्हें इस व्यवहार पर भरोसा नहीं करना चाहिए, लेकिन वह असहमत हैं, और मुझे समझाने में परेशानी हो रही है। इसके अलावा, मुझे दिलचस्पी है कि ऑर्डर इतनी बार संरक्षित क्यों प्रतीत होता है।

तो मेरा सवाल है ... Dictionary, मूल रूप से अपरिवर्तित संग्रह क्यों है, ऐसा लगता है कि इसे हल किया गया है?

+3

शब्दकोश <> कोई गारंटी नहीं कि संग्रह अव्यवस्थित है प्रदान करता है । यह उद्देश्य पर यादृच्छिक उपयोग नहीं करता है। हां, कोड गलत है। –

+1

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

+0

मुझे नहीं पता (यही कारण है कि मैं इसे एक टिप्पणी के रूप में पोस्ट कर रहा हूं) लेकिन मुझे लगता है कि यह एसक्यूएल जैसा ही है: 'SELECT' द्वारा लौटाई गई पंक्तियां अनिर्दिष्ट क्रम में वापस आती हैं जब तक कि 'ऑर्डर बीई' खंड शामिल न हो । अक्सर, विशेष रूप से छोटे डेटा सेट में, पंक्तियों को उसी क्रम में वापस कर दिया जाता है, जो बहुत से लोगों को भ्रमण करता है। (मैं हमेशा लोगों को 'ऑर्डर बाय' शामिल करने के लिए कहता हूं, यदि वे परिणामों के क्रम के बारे में बिल्कुल परवाह करते हैं। यह * इसके बिना काम कर सकता है, लेकिन यह भी बहुत तोड़ सकता है।) –

उत्तर

6

यह क्रमबद्ध है, क्योंकि Dictionary लागू किया गया है (और आपके मामले में आइटम क्रम में जोड़े गए हैं)। लेकिन यह कार्यान्वयन विवरण है।

बताओ अपने सह कार्यकर्ता वहाँ एक SortedDictionary वर्ग कि मौजूद है, यह उसे समझाने चाहिए हम वस्तुओं पर भरोसा नहीं कर सकते एक सरल Dictionary के साथ आदेश;)

+0

के लिए धन्यवाद यह एक कार्यान्वयन विस्तार है, यकीन है, लेकिन मुझे नहीं लगता इसे बदलने के लिए जा रहा है है। शायद यह कहना ठीक है कि जोड़ें() - केवल शब्दकोश ही आदेश को संरक्षित करते हैं। –

+0

@EldritchConundrum वास्तव में, आपको यह नहीं मानना ​​चाहिए। वर्तमान में यह मामला है, लेकिन भविष्य के संस्करण में यह नहीं हो सकता है। और ढांचे के अन्य कार्यान्वयन के बारे में सोचें (उदाहरण के लिए मोनो), इस बात की कोई गारंटी नहीं है कि उन्होंने उसी तरह शब्दकोश को लागू किया है। – ken2k

+0

हां। सबसे महत्वपूर्ण बात यह है कि अब मुझे पता है कि एक टेस्ट केस कैसे बनाया जाए जिससे मेरा सहकर्मी का कोड असफल हो जाए;) मुझे सिर्फ फोरच से पहले हटाना और जोड़ना होगा। –

3

जब एक शब्दकोश में फिर से शुरू होता है तो आप इसमें the order they were inserted to the dictionary में आइटम प्राप्त करेंगे।

उदाहरण में, एक सूची क्रमबद्ध हो जाती है, तो प्रत्येक आइटम को बदले में शब्दकोश में जोड़ा जाता है।

अंतिम परिणाम यह है कि शब्दकोश में आइटम सूची के क्रम क्रम में हैं।

हालांकि, यह Dictionary के वर्तमान कार्यान्वयन के मामले में होता है - इस बात की कोई गारंटी नहीं है कि यह इस तरह रहेगा।

यदि आपको किसी विशिष्ट क्रम में Dictionary में आइटम रखने की आवश्यकता है, तो आपको SortedDictionary का उपयोग करना चाहिए।

+0

क्या आप बेहतर समझा सकते हैं कि वे क्यों क्रमबद्ध हैं। मैं कहूंगा कि वे अपने हैश द्वारा "आदेशित" हैं, जो संपत्ति "आईडी" –

+1

@LuisFilipe है - मैं इसका पालन नहीं करता हूं। सूची का आदेश दिया गया ('सूची।ऑर्डरबी (आइटम => आइटम। ऑर्डर) 'फिर एक' डिक्शनरी 'में परिवर्तित हो गया। रूपांतरण प्रत्येक आइटम को शब्दकोश में जोड़कर काम करता है। शब्दकोश में आइटम "आदेश दिया गया" है कि वे सम्मिलन क्रम में हैं। चूंकि वे क्रम में _inserted_ थे, शब्दकोश क्रम में है। – Oded

+0

क्या यह विनिर्देश/अनुबंध द्वारा गारंटीकृत है, या यह एक आर्टिफैक्ट है कि एक विशिष्ट कार्यान्वयन कैसे लिखा जाता है? यदि यह गारंटीकृत व्यवहार है, तो उद्धरण उपयोगी होगा। –