2010-08-06 37 views

Trả lời

28
var itemsOneThroughTwenty = myList.Take(20); 
var itemsFiveThroughTwenty = myList.Skip(5).Take(15); 
+6

Lưu ý rằng các phần mở rộng LINQ này thực sự tạo một IEnumerable <> dừng sau N mục, thay vì tạo một mảng/danh sách mới. (Đây là loại ẩn bằng cách sử dụng 'var' cho loại biến. Nếu mã sau cắt ngắn lặp qua danh sách mới nhiều lần, bạn sẽ thực sự được đánh giá lại cây biểu thức * mỗi lần *. , bạn có thể muốn tack một '.ToList()' vào cuối để buộc các mục được liệt kê và một danh sách mới được tạo ra – JaredReisinger

19

Bạn có thể sử dụng List<T>.GetRange():

var subList = myList.GetRange(0, 20); 

Từ MSDN:

Tạo một bản sao cạn của một loạt các yếu tố trong nguồn List<T>.

public List<T> GetRange(int index, int count)

2

sans LINQ quicky ...

while (myList.Count>countIWant) 
     myList.RemoveAt(myList.Count-1); 
0
public static IEnumerable<TSource> MaxOf<TSource>(this IEnumerable<TSource> source, int maxItems) 
    { 
     var enumerator = source.GetEnumerator();    
     for (int count = 0; count <= maxItems && enumerator.MoveNext(); count++) 
     { 
      yield return enumerator.Current; 
     } 
    } 
+0

Vì nó đứng bạn có thể xem xét thêm một số văn bản giải thích, bởi vì người dùng ít kinh nghiệm có thể đấu tranh để hiểu câu trả lời. – Raad

3

này có thể hữu ích cho hiệu quả, nếu bạn thực sự muốn cắt ngắn danh sách, không tạo một bản sao. Trong khi ví dụ python tạo một bản sao, câu hỏi ban đầu thực sự là về việc cắt xén danh sách.

Với một danh sách <> đối tượng "danh sách" và bạn muốn 1 thông qua các yếu tố 20

list.RemoveRange(20, list.Count-20); 

này làm nó tại chỗ. Đây vẫn là O (n) vì các tham chiếu đến từng đối tượng phải được loại bỏ, nhưng phải nhanh hơn một chút so với bất kỳ phương thức nào khác.

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