2012-06-21 10 views
10

Biorąc pod uwagę granice List są znane, czy .Last() wylicza kolekcję?Czy lista <T> .Last() wylicza kolekcję?

Pytam o to, ponieważ documentation mówi, że jest ona zdefiniowana przez Enumerable (w którym to przypadku byłoby trzeba wyliczyć kolekcję)

Jeśli ma wyliczyć kolekcję to mogę po prostu przejść ostatni Element o indeksie (jak wiemy .Count o List<T>), ale wydaje się głupie to zrobić ....

+0

Jeśli wiesz, że masz 'Lista ', a potem po prostu dostęp do ostatniego elementu w szybki sposób, bez konieczności korzystania z możliwych non-udokumentowanych optymalizacje w 'Last()'. (Tak się składa, że ​​'Last()' * does * sprawdza, czy odbiornik implementuje 'IList ' i optymalizuje ten przypadek.) – dlev

+0

@dlev tak, jak już wspomniałem, jestem świadomy, że mogę to zrobić ... pytam w szczególności o implementację '.Last' – Matthew

+0

Jestem prawie pewny, że implementacja sprawdza' List 'i dostęp do ostatniego elementu przez indeks, jeśli to możliwe. – Lee

Odpowiedz

11

robi wyliczyć kolekcję jeśli jest to IEnumerable<T> a nie IList<T> (z tablicą lub notować indeks będzie być użytym).

Enumerable.Last jest realizowany w następujący sposób (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

Twój kod pod warunkiem, że ** nie **, nie powoduje wyliczenia listy 'List ' ... ale twoja pierwsza linia mówi "Tak" ;-) – Matthew

+0

Nie masz na myśli "nie"? Wygląda na to, że sprawdza dla ILista dla mnie ... – itsme86

+2

@MatthewPK To jest "Tak, iteruje cały wyliczalny, jeśli to nie jest" IList '" Trochę mylące, ale poprawne. – dlev