2012-06-21 21 views
10

Considerando que se conocen los límites de List, ¿.Last() enumera la colección?¿La lista <T> .Last() enumera la colección?

Lo pregunto porque el documentation dice que se define por Enumerable (en cuyo caso se sería necesidad de enumerar la colección)

Si no enumerar la colección entonces simplemente puede acceder a la última elemento por el índice (como sabemos el .Count de un List<T>) pero parece tonto tener que hacer esto ....

+0

Si usted sabe que tiene un 'Lista ', a continuación, sólo acceder al último elemento de la manera rápida, sin depender de las posibles optimizaciones no documentados en 'Last()'. (Ocurre que 'Last()' * does * verifica para ver si el receptor implementa 'IList ', y optimiza ese caso.) – dlev

+0

@dlev sí, como mencioné, soy consciente de que puedo hacer esto ... Estoy preguntando particularmente sobre la implementación de '.Last' – Matthew

+0

Estoy bastante seguro de que la implementación verifica' List ' y acceda al último elemento por índice si es posible. – Lee

Respuesta

11

no enumerar la colección si es un IEnumerable<T> y no un IList<T> (con una matriz o lista de la índice sería ser usado).

Enumerable.Last se implementa de la siguiente manera (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

Su código proporcionado demostró que ** no **, no causa una enumeración de la 'Lista ' ... pero su primera línea dice "Sí" ;-) – Matthew

+0

¿No quiere decir "no"? Parece que comprueba IList ... – itsme86

+2

@MatthewPK Es "Sí, repetirá todo el enumerable si no es un' IList '" Un poco confuso, pero correcto. – dlev

Cuestiones relacionadas