IEnumerable .Last () est-il optimisé pour List ?

J’ai une List , appelée L , contenant N éléments.

Est-ce que L.Last() , la méthode d’extension IEnumerable , va parcourir tous les N éléments en temps linéaire?

Ou est-il optimisé en interne pour obtenir la performance à temps constant de L[L.Count - 1] ?

Vous avez raison, si vous regardez le code comment implémenter Last (à partir de Reflector):

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

En fait, il optimise pour List en renvoyant list[count - 1];