2011-06-23 18 views
7
List<string> list = new List<string>() {"a", "b", "c"}; 
IEnumerable<string> enumerable = list; 

int c1 = list.Count; 
int c2 = list.Count(); 
int c3 = enumerable.Count(); 

के बीच एक अंतर कर रहे हैं कि इन पिछले 3 बयानों के बीच प्रदर्शन और कार्यान्वयन में अंतर वहाँ है? list.Count()list.Count के रूप में खराब या समान प्रदर्शन करेगा, और इससे कोई फर्क नहीं पड़ता कि संदर्भ IEnumerable<string> है?गणना() (LINQ विस्तार) और सूची <T> .Count

उत्तर

10

के परावर्तक के साथ देखें:

public static int Count<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    ICollection<TSource> is2 = source as ICollection<TSource>; 
    if (is2 != null) 
    { 
     return is2.Count; 
    } 
    ICollection is3 = source as ICollection; 
    if (is3 != null) 
    { 
     return is3.Count; 
    } 
    int num = 0; 
    using (IEnumerator<TSource> enumerator = source.GetEnumerator()) 
    { 
     while (enumerator.MoveNext()) 
     { 
      num++; 
     } 
    } 
    return num; 
} 

तो, अपने IEnumerable<T> लागू करता है, तो ICollection<T> या ICollection, यह Count संपत्ति वापस आ जाएगी।

0

मुझे लगता है कि यह इस तरह काम करता है: एक सूची एक चर में अपनी गिनती रखती है। तत्वों की संख्या गिनने के लिए Inumerable के माध्यम से गणना() लूप। वह सूची बना देगा। अधिक कुशल गणना करें।

+0

यदि आईन्यूमेरेबल एक आईसीओलेक्शन (जैसे एक सूची) है तो इसलिए। काउंटी प्रॉपर्टी है, तो जब आप .Count() विधि का उपयोग करते हैं तो लिंक इसे शॉर्टकट के रूप में उपयोग करता है। इसका मतलब है कि जो भी आप उपयोग करते हैं वह वास्तव में कोई फर्क नहीं पड़ता। – Dolbz

+0

यह गलत है। गणना() को कोड किया गया है कि यह केवल गिनती के माध्यम से गुम हो जाता है यदि आप जिस तत्व को कॉल कर रहे हैं, उस पर गणना() पर आईसीओलेक्शन को लागू नहीं करता है। –

3

लिंक गणना विधि अंतर्निहित संग्रह पर पुनरावृत्ति करने के लिए पर्याप्त चालाक नहीं है अगर यह आईसीओलेक्शन इंटरफ़ेस लागू करती है और इसलिए पहले से ही गणना संपत्ति है।

1

IEnumerable पर गिनती के कार्यान्वयन पहले जांचता है कि क्या संख्यात्मक सूची ICollection<T> लागू करती है जहां टी संख्यात्मक सूची का सामान्य पैरामीटर है।

यदि ऐसा होता है, तो यह ICollection<T>.Count देता है।

यदि नहीं, तो यह जांचता है कि यह ICollection लागू करता है या नहीं। अगर यह ICollection.Count देता है।

यदि यह उन लोगों में से किसी एक को लागू नहीं करता है, तो इसे पूरी सूची और गिनती के माध्यम से फिर से शुरू करना होगा, और यह एक बड़ी सूची के लिए एक महंगा संचालन हो सकता है।

List<string> हालांकि ICollection<string> लागू करता है और इसलिए प्रदर्शन समान होगा।

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