2010-07-19 18 views

उत्तर

4

नहीं, यह ओ (एन) है। IEnumerable<T> पर सभी एक्सटेंशन विधियां आवश्यक हैं, ओ (एन) (क्योंकि केवल एक चीज जो IEnumerable<T> कर सकती है ... गणना करें)। हालांकि, टिप्पणियों में बताया गया है कि, वे एक इंटरफ़ेस को डालने का प्रयास करते हैं जो ऑपरेशन को तेज़ी से कार्यान्वित कर सकता है (उदाहरण के लिए, ElementAt ओ (1) ऑपरेशन को लागू करने के लिए IList<T> पर डालने का प्रयास करेगा)। ऐसा नहीं है कि HashSet<T> के मामले में मदद करता है जो IList<T> को लागू नहीं करता है।

HashSet<T> के लिए "एलिमेंटएट" की अवधारणा वास्तव में समझ में नहीं आती है, क्योंकि इस तरह कोई "ऑर्डरिंग" नहीं है। आप मूल रूप से सिर्फ यादृच्छिक तत्व प्राप्त कर रहे हैं।

+0

फिर यदि आपको कई पंक्तियों पर ElementAt का उपयोग करने की आवश्यकता है तो 'ToArray' को एक बेहतर चीज़ करना होगा? क्या हैससेट के साथ "सही" ऑर्डर प्राप्त करना कभी संभव नहीं है? –

+2

हां, एक 'ToArray' और फिर एकाधिक "तत्व" ('[]' ऑपरेटर के माध्यम से) बहुत तेज होगा। हैशसेट के साथ "सही" ऑर्डर जैसी कोई चीज़ नहीं है, क्योंकि किसी भी सार्थक तरीके से तत्वों का आदेश नहीं दिया जाता है। –

+0

ठीक है, हालांकि जब मैं ऐसा करता हूं: {2, 3, 4} और उन लोगों के साथ दो हैशसेट शुरू करें, मुझे प्रत्येक तत्व के माध्यम से कदम उठाने पर सही क्रम मिलती है। –

2

कोई ElementAt विधि में HashSet तो आप शायद Enumerable.ElementAt विधि के प्रदर्शन को पता है जब HashSet<T> का एक उदाहरण पर इस्तेमाल करना चाहते हैं।

Enumerable.ElementAt विधि IList<T> लागू करने वाले प्रकारों के लिए एक अनुकूलन है। उस मामले में प्रदर्शन ओ (1) है। हालांकि, हैशसेट इस इंटरफेस को लागू नहीं करता है, इसलिए प्रदर्शन ओ (एन) है।

+0

@ स्टेवेन, एक एलिमेंट एक्ट becuase हैशसेट आईसीलेक्शन से निकला है। –

+0

@ फिलिप: 'हैशसेट 'आईसीओलेक्शन ' से प्राप्त होता है, लेकिन' आईसीओलेक्शन 'में 'ElementAt' विधि नहीं है। 'हैशसेट ' कम से कम .NET 3.5sp1 में नहीं है 'एक' ElementAt' विधि contian। – Steven

+0

@ स्टीवन, मैं .NET 4.0 का उपयोग कर रहा हूं और रीशेपर मुझे 'आईसीओलेक्शन ' का उपयोग करने का सुझाव देता है, जहां मैं 'हैशसेट ' लेना चाहता हूं। वैसे भी, 'ToArray' का उपयोग करके चीजों को बहुत तेज किया जाता है। –

2

यह अंडरलिंग सूची प्रकार पर निर्भर करता है। परावर्तक दिखाता है कि Enumerable<T>.ElementAt(...) पहले IList<T> पर डालने का प्रयास करता है। उस मामले में यह ओ (1) होगा।

उदाहरण के लिए एक क्वेरी प्रदाता कुछ ऐसा कर सकता है जो IList<T> है। लेकिन संभावना है कि यदि आप किसी भी लिंक ऑपरेटर को लागू करते हैं, तो यह IEnumerable<T> में बदल जाएगा, क्योंकि वे केवल विभिन्न गणक का उपयोग करके बनाए जाते हैं, और यह ओ (एन) बन जाएगा।

संपादित करें: मैंने HashSet को ओवरड्रेड किया। HashSet<T>IList<T> लागू नहीं करता है, इस प्रकार यह ओ (एन) है।

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