2008-10-03 10 views
18

क्या यह मानना ​​सुरक्षित है कि एक ही संग्रह पर दो पुनरावृत्तियों ने ऑब्जेक्ट को उसी क्रम में वापस कर दिया है? जाहिर है, यह माना जाता है कि संग्रह अन्यथा नहीं बदला गया है।क्या फोरएच स्थिर द्वारा लौटाई गई वस्तुओं का क्रम है?

उत्तर

15

संक्षिप्त उत्तर - हाँ।

स्पष्ट रूप से, संग्रह में वस्तुओं का क्रम ठीक उसी तरह नहीं हो सकता है, जैसा संग्रह के प्रकार (उदाहरण के लिए, एक शब्दकोश) के आधार पर किया गया था।

लेकिन जब भी आप फोरैच लूप का उपयोग करके एकल, अनमोड संग्रह पर पुनरावृत्ति करते हैं तो आपको वही परिणाम मिलेंगे।

+0

हम्मम्म ... लगता है कि हम दोनों ने एक ही काम किया है। एक वाक्य लिखा, इसे पोस्ट किया, और फिर इसे विस्तृत करने के लिए तुरंत संपादित किया। वास्तव में –

+0

। मुझे लगता है कि आपका उत्तर मेरी तुलना में अधिक उपयुक्त है, उम्मीद है कि ओपी इसे निश्चित रूप से टैग करेगा। निश्चित रूप से लोकप्रिय वोट जीतने लगते हैं :) –

+0

निश्चित रूप से इसे निश्चित उत्तर के रूप में टैग करने में समस्या यह है कि यह सटीक नहीं है! –

25

यह संग्रह प्रकार पर निर्भर करता है। अधिकांश संग्रहों के लिए, जवाब "हां" है।

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

0

मैं कहूंगा कि अधिकांश संग्रह के लिए यह मानना ​​सुरक्षित है। यह संभावना के क्षेत्र से परे नहीं है कि एक निश्चित संग्रह में गैर-निर्धारक तरीके से लागूकर्ता को लागू किया जा सकता है, लेकिन शायद यह नहीं होने वाला है ...

+0

निर्भर करता है कि आपको ऐसा कोड पसंद है जो "शायद" काम करने जा रहा है। व्यक्तिगत रूप से मैं उससे ज्यादा आत्मविश्वास होना पसंद करता हूं! – MarkJ

6

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

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9)) 
    Console.WriteLine(i); 

यह अच्छी तरह से एक वर्ग है कि प्रत्येक यात्रा के लिए एक अलग आदेश पैदावार के रूप में लागू किया जा सकता:

मैं निम्नलिखित उपयोग के मामले कल्पना कर सकता।

तो - यदि आप अजीब सीमा रेखा के मामलों पर भी विचार करना चाहते हैं, तो जवाब "कोई" होना चाहिए।

+0

उह, क्या जेम्स ने अपना जवाब बदल दिया? जब मैंने अपना लिखा, तो यह अभी भी मूल था। : -/ –

+0

एक मामले का उत्कृष्ट उदाहरण जब आदेश सुसंगत नहीं होगा! –

3

आमतौर पर, तत्वों को उसी क्रम में वापस कर दिया जाएगा, बिल्कुल कोई गारंटी नहीं है। यह संग्रह वर्ग के आंतरिक कार्यान्वयन पर पूरी तरह से निर्भर है।

मैं एक संग्रह वर्ग के लिए एक केस देख सकता हूं जो विशेष रूप से यादृच्छिक क्रम में तत्वों को वापस करने के लिए डिज़ाइन किया गया है, उदाहरण के लिए।

संक्षेप में, जब तक कि आप संग्रह वर्ग की आंतरिक कार्यान्वयन पता है, आदेश के बारे में कुछ भी कल्पना नहीं है।

10

आप तब तक इसकी गारंटी नहीं दे सकते जब तक आप उस वर्ग के ठोस कार्यान्वयन को नहीं जानते जब आप इसे चालू कर रहे हैं।

संग्रह जो परिभाषित तत्व ऑर्डर (उदा। List<T>) एक स्थिर क्रम में गणना करेंगे।

संग्रह के लिए जहां ऑब्जेक्ट की स्थिति में बदलाव नहीं होता है, यह अत्यधिक संभावना है कि तत्व उसी क्रम में वापस आ जाएंगे, उदा। Dictionary<K,V>, हालांकि यह विनिर्देशन द्वारा गारंटी नहीं है।

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

1

पुन "अनमोडिफाइड" (एनएम का उत्तर) - ध्यान दें कि शब्दकोश जैसे कई जटिल कंटेनर ऑर्डर को सुरक्षित रखने की गारंटी नहीं देते हैं। कभी-कभी कोई आइटम जोड़ने से यह आखिरी दिखाई देगा (इंप्रेशन देकर कि ऑर्डर संरक्षित है), और कभी-कभी यह आंतरिक बाल्टी को फिर से व्यवस्थित करने का कारण बनता है, जिससे एक पूरी तरह से अलग ऑर्डर मिलता है।

सॉर्टेडलिस्ट <,> आदि जैसी चीजें स्पष्ट रूप से अपने स्वयं के नियम हैं।

2

लिंक इस उद्देश्य के लिए IOrderedEnumerable इंटरफेस को परिभाषित करता है।

संबंधित मुद्दे

 संबंधित मुद्दे