http://msdn.microsoft.com/en-us/library/ms132433.aspx से:
इस संपत्ति का मूल्य एक प्राप्त कर रहा है हे (1) ऑपरेशन है।
यह गारंटी देता है कि Count
तक पहुंचने से पूरे संग्रह में पुन: प्रयास नहीं होगा।
संपादित करें: के रूप में कई अन्य पोस्टर का सुझाव दिया, IEnumerable<...>.Count()
तथापि है नहीं हे होने की गारंटी (1)। देखभाल के साथ प्रयोग करें!
IEnumerable<...>.Count()
एक विस्तार विधि System.Linq.Enumerable
में परिभाषित किया गया है। वर्तमान कार्यान्वयन एक स्पष्ट परीक्षण करता है, तो गिना IEnumerable<T>
वास्तव में ICollection<T>
का एक उदाहरण है, और ICollection<T>.Count
का उपयोग करता है यदि संभव हो तो। अन्यथा यह IEnumerable<T>
(संभावित आलसी मूल्यांकन का विस्तार करने) को पार करता है और वस्तुओं को एक-एक करके गिना जाता है।
हालांकि मुझे दस्तावेज में नहीं मिला है कि क्या यह गारंटी है कि IEnumerable<...>.Count()
यदि संभव हो तो ओ (1) का उपयोग करता है, मैंने केवल प्रतिबिंबक के साथ .NET 3.5 में कार्यान्वयन की जांच की है।
आवश्यक देर अलावा: कई लोकप्रिय कंटेनरों Collection<T>
से प्राप्त कर रहे नहीं, लेकिन फिर भी उनके Count
संपत्ति हे (1) है (जो है, पूरे संग्रह से अधिक पुनरावृति नहीं होगा)। उदाहरण HashSet<T>.Count
(यह सबसे अधिक संभावना है कि ओपी क्या पूछना चाहता था), Dictionary<K, V>.Count
, LinkedList<T>.Count
, List<T>.Count
, Queue<T>.Count
, Stack<T>.Count
और इसी तरह।
इन सभी संग्रह ICollection<T>
है या सिर्फ ICollection
लागू है, इसलिए उनके Count
ICollection<T>.Count
(या ICollection.Count
) के एक कार्यान्वयन है। प्रलेखन के अनुसार ICollection<T>.Count
के कार्यान्वयन के लिए यह आवश्यक नहीं है कि ओ (1) ऑपरेशन हो, लेकिन ऊपर वर्णित लोग इस तरह से कर रहे हैं।
(एक तरफ ध्यान दें: कुछ कंटेनर, उदाहरण के लिए, Queue<T>
के लिए, लागू गैर सामान्य ICollection
नहीं बल्कि ICollection<T>
, तो वे "वारिस" केवल ICollection
से से Count
संपत्ति।)
अच्छा सवाल। मैं एक आंतरिक int की आशा करता हूं, क्योंकि ज्यादातर मामलों में यह करना काफी आसान होगा, लेकिन मुझे नहीं पता। – Tarka