2012-06-21 9 views
10

Considerando i limiti di uno List, il numero .Last() enumera la raccolta?L'elenco <T> .Last() enumera la raccolta?

Lo chiedo perché il documentation dice che è definito da Enumerable (nel qual caso sarebbe necessità di enumerare la raccolta)

Se non enumera la raccolta allora posso semplicemente accedere all'ultima elemento per indice (come sappiamo la .Count di un List<T>) ma sembra stupido avere a che fare questo ....

+0

Se sai di avere un 'elenco ', poi basta accedere l'ultimo elemento del modo veloce, senza fare affidamento su eventuali ottimizzazioni non documentati in 'Last()'. (Succede che 'Last()' * fa * verifica se il ricevitore implementa 'IList ' e ottimizza il caso.) – dlev

+0

@dlev si, come ho detto, sono consapevole di poterlo fare ... I Sto chiedendo in particolare l'implementazione di '.Last' – Matthew

+0

Sono abbastanza sicuro che i controlli di implementazione per' Elenco 'e accedere l'ultimo elemento per indice, se possibile. – Lee

risposta

11

essa enumera la raccolta se è un IEnumerable<T> e non un IList<T> (con un array o un elenco del indice sarebbe essere usato).

Enumerable.Last è implementato nel modo seguente (ILSpy):

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

Il tuo codice fornito ha dimostrato che ** no **, non causa un'enumerazione dell''elenco '... ma la prima riga dice" Sì ";-) – Matthew

+0

Non intendi" no "? Sembra che controlli per IList per me ... – itsme86

+2

@MatthewPK È "Sì, itererà l'intero enumerable se non è un' IList '" Un po 'confuso, ma corretto. – dlev