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];