2012-06-21 26 views
10

Xem xét ranh giới của một List được biết, không .Last() liệt kê bộ sưu tập?Danh sách <T> .Last() liệt kê bộ sưu tập?

Tôi yêu cầu này vì documentation nói rằng nó được xác định bởi Enumerable (trong trường hợp này nó sẽ cần phải liệt kê bộ sưu tập)

Nếu nó không liệt kê bộ sưu tập sau đó tôi có thể chỉ đơn giản là truy cập cuối cùng phần tử bằng cách chỉ mục (như chúng ta biết các .Count của một List<T>) nhưng có vẻ như ngớ ngẩn phải làm điều này ....

+0

Nếu bạn biết bạn có một 'Danh sách ', sau đó chỉ cần truy cập vào yếu tố cuối cùng một cách nhanh chóng, mà không dựa vào khả năng tối ưu hóa không ghi nhận trong 'Last()'. (Nó xảy ra như vậy 'Last()' * does * kiểm tra xem máy thu có thực hiện 'IList ' hay không và tối ưu hóa trường hợp đó.) – dlev

+0

@dlev vâng, như tôi đã đề cập, tôi biết mình có thể làm điều này ... yêu cầu đặc biệt về việc thực hiện '.Last' – Matthew

+0

Tôi khá chắc chắn việc kiểm tra thực hiện cho' List 'và truy cập phần tử cuối cùng bằng chỉ mục nếu có thể. – Lee

Trả lời

11

nó liệt kê bộ sưu tập nếu nó là một IEnumerable<T> và không phải là một IList<T> (với một mảng hoặc danh sách chỉ số sẽ được dùng).

Enumerable.Last được thực hiện theo cách sau (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

Mã của bạn được cung cấp chứng minh rằng ** không **, nó không gây ra một liệt kê của 'Danh sách ' ... nhưng dòng đầu tiên của bạn nói "Có" ;-) – Matthew

+0

Bạn không có nghĩa là "không"? Có vẻ như nó kiểm tra cho IList với tôi ... – itsme86

+2

@MatthewPK Đó là "Có, nó sẽ lặp lại toàn bộ đếm nếu nó không phải là một' IList '" Một chút khó hiểu, nhưng chính xác. – dlev

Các vấn đề liên quan