2013-08-13 20 views
6

मेरे पास List<T> है, जिसे L कहा जाता है, जिसमें एन आइटम होते हैं।आईन्यूमेरेबल <T> है .स्ट() सूची <T> के लिए अनुकूलित किया गया है?

L.Last(), IEnumerable<T> विस्तार विधि, रैखिक समय में सभी एन आइटमों के माध्यम से चलाने के लिए जा रहा है?

या क्या यह आंतरिक रूप से L[L.Count - 1] का निरंतर समय प्रदर्शन करने के लिए अनुकूलित किया गया है?

+2

हाँ वापस लौट कर। 'अंतिम' फंक्शन लूप का टॉफी रैपर है। –

उत्तर

11

आप ठीक कह रहे हैं, यदि आप एक बार देख ले कोड कैसे (परावर्तक से) Last लागू करने के लिए:

public static TSource Last<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    IList<TSource> list = source as IList<TSource>; 
    if (list != null) 
    { 
     int count = list.Count; 
     if (count > 0) 
     { 
      return list[count - 1]; 
     } 
    } 
    else 
    { 
     using (IEnumerator<TSource> enumerator = source.GetEnumerator()) 
     { 
      if (enumerator.MoveNext()) 
      { 
       TSource current; 
       do 
       { 
        current = enumerator.Current; 
       } 
       while (enumerator.MoveNext()); 
       return current; 
      } 
     } 
    } 
    throw Error.NoElements(); 
} 

यह वास्तव में List<T> के लिए अनुकूलन list[count - 1];

+0

के अंदर कोई जादू नहीं है और भले ही इसे इस कोड में अनुकूलित नहीं किया गया हो, फिर भी यदि पर्याप्त जानकारी हो तो जेआईटी कंपाइलर संभावित रूप से कॉल को अनुकूलित कर सकता है। –

+0

यह मेरे लिए दिलचस्प है, इसे 'आईसीओलेक्शन काउंटर' के लिए अनुकूलित नहीं किया गया था (दिया गया 'IList : आईसीओलेक्शन ')। चीजें जो आपको हम्म बनाती हैं। –

+0

+1। क्या आप उपर्युक्त कोड के लिए लिंक दिखा सकते हैं? –

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