2009-08-17 40 views

Trả lời

10

sử dụng LINQ

list.Skip(fromRange).Take(toRange - fromRange) 
+2

Điều này có trả lại chế độ xem vào Danh sách gốc hoặc bản sao của phạm vi không? –

+0

Hoạt động trên IList, không chỉ trên Danh sách, đây là những gì tôi đang tìm kiếm. – ripper234

+1

@ Joachim Sauer: Đây là một truy vấn và kết quả của nó phụ thuộc vào cách nó được đánh giá. Trong khi đánh giá, nó lặp qua các phần tử danh sách áp dụng một số quy tắc. Đây không phải là tương tự thẳng cho chức năng subList của Java, và nó là sai lầm để so sánh chúng trong trường hợp này. – Kamarey

9

Đối với loại chung List<T>, đó là phương pháp GetRange(int, int).

Chỉnh sửa: lưu ý rằng đây là bản sao nông, không phải là 'chế độ xem' trên bản gốc. Tôi không nghĩ C# cung cấp chức năng chính xác đó.

Edit2: như Kamarey chỉ ra, bạn có thể có một cái nhìn chỉ đọc:

List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 }; 
IEnumerable<int> view = integers.Skip(2).Take(3); 
integers[3] = 42; 

foreach (int i in view) 
    // output 

trên sẽ in 7, 42, 9.

+2

Từ tài liệu MSDN (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx) dường như không giống nhau: GetRange() trả về một bản sao nông, trong khi subList() trả về một khung nhìn (tức là những thay đổi đối với subList() sẽ được phản ánh trong Danh sách gốc!) –

+0

ok bạn đã đúng. Không chắc chắn nếu đây là yêu cầu chính xác, nhưng tôi sẽ chỉnh sửa câu trả lời của tôi để phản ánh điều đó. – Razzie

1

GetRange là câu trả lời của bạn

+3

Một lần nữa: nó không * chính xác * cùng một điều, vì nó trả về một bản sao nông thay vì một cái nhìn. Trả lại một khung nhìn cho phép một số thủ thuật khá tiện lợi (nó làm cho nó không cần thiết để cung cấp một phương thức RemoveRange() chẳng hạn, vì nó có thể dễ dàng được viết dưới dạng list.subList (x, y) .clear()). –

+0

Tôi phải thành thật nói rằng tôi không thực sự thấy những lợi ích. Ngoài ra, removeRange() và subList.clear() không giống như điều tương tự, vì thanh toán bù trừ không được giống như loại bỏ dải ô. Nhưng oh well :-) – Razzie

+5

Ngay khi bạn mò mẫm khái niệm rằng subList() trả về một cái nhìn vào List gốc (và không phải là một bản sao), nó sẽ trở nên rõ ràng rằng someList.subList (1,3) .clear() sẽ loại bỏ các đối tượng khỏi Danh sách gốc. Và phần quan trọng nhất không phải là tốt hơn hay không, nhưng subList() và GetRange() không làm điều tương tự, vì vậy chúng không được trình bày tương đương (ít nhất là không có từ chối). –

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