2012-06-21 19 views
10

List'un sınırları göz önüne alındığında, .Last() koleksiyonu numaralandırıyor mu? documentation o (bu durumda o koleksiyonunu numaralandırmak için ihtiyaç olurdu) onu koleksiyonunu numaralandırmak yoksaListe <T> .Last() koleksiyonu toplar mı?

sonra ben sadece son erişebilir Enumerable tarafından tanımlandığını söylüyor çünkü

Bunu sormak endeksi ile eleman (biz bir List<T> ait .Count bildiğimiz gibi) ama

+0

mümkün olmayan belgelenmiş optimizasyonları dayanmadan bir 'List ', o zaman sadece, son elemanını hızlı bir şekilde erişmek vardır:

Enumerable.Last aşağıdaki şekilde (ILSpy) uygulanan Son() 'de. (Bu, 'Last()' * * alıcının IList 'yi uygulayıp uygulamadığını kontrol eder ve bu durumu optimize eder.) – dlev

+0

@dlev evet, bahsettiğim gibi, bunu yapabileceğimin farkındayım ... '.Last' – Matthew

+0

özellikle uygulanması hakkında soruyorum 'Uygulama ' için denetler ve mümkünse endeksle son öğeye erişir eminim. – Lee

cevap

11

o bir Array ile (bir IEnumerable<T> değil bir IList<T> eğer toplama numaralandırmak veya Liste yok .... bunu yapmak zorunda saçma görünüyor endeks Kullanılabilir) Biliyorsanız

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

Verilen kodunuz ** no **, 'List 'numarasına bir numaralamaya neden olmaz ... ancak ilk satırınız" Evet ";-) – Matthew

+0

" Hayır "demek istemiyor musunuz? Bu bana IList için kontrol ediyor gibi görünüyor ... – itsme86

+2

@MatthewPK Bu, "IList " değilse bile tüm sayıları yinelemeli. "Biraz kafa karıştırıcı, ama doğru. – dlev