2013-08-13 7 views
6

Mam List<T>, o nazwie L, zawierający N pozycji.Czy IEnumerable <T> .Last() zoptymalizowano dla listy <T>?

Czy L.Last(), metoda rozszerzenia, będzie przebiegać przez wszystkie elementy N w czasie liniowym?

Czy jest wewnętrznie zoptymalizowany, aby zapewnić stałą wydajność L[L.Count - 1]?

+2

Tak. Funkcja 'Last' to toffee Wrapper of Loop. Żadna magia wewnątrz –

Odpowiedz

11

Masz rację, jeśli spojrzeć kod jak wdrożyć Last (z reflektorem):

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(); 
} 

To faktycznie optymalizuje dla List<T> wracając list[count - 1];

+0

Nawet jeśli nie został zoptymalizowany w tym kodzie, kompilator JIT mógłby potencjalnie zoptymalizować połączenie, gdyby miał wystarczająco dużo informacji. –

+0

To interesujące, dla mnie, nie został zoptymalizowany dla 'ICollection .Count' (biorąc pod uwagę' IList : ICollection '). rzeczy, które sprawiają, że odchodzisz Hmm. –

+0

+1. Czy możesz pokazać link do powyższego kodu? –

Powiązane problemy