2012-05-10 45 views
7

Tôi có một danh sách các phần tử, tuy nhiên nếu số phần tử danh sách lớn hơn 4, tôi muốn xóa tất cả các phần tử nhưng chỉ để lại 4 phần tử đầu tiên trong danh sách.C# - Danh sách - loại bỏ tất cả các phần tử nhưng KHÔNG phải là bốn phần đầu tiên

Ví dụ:

Danh sách <> - 1, 2, 3, 4, 5, 6, 7, 8

Danh sách mới nên - 1,2,3,4

tôi đang xem xét sử dụng List.RemoveAll() nhưng không chắc chắn những gì để đặt trong ngoặc

mong sự giúp đỡ ....

Steven

Trả lời

15

Tại sao không sử dụng List.RemoveRange:

if (list.Count > 4) 
{ 
    list.RemoveRange(4, list.Count - 4); 
} 

(Đó là giả sử bạn muốn để biến những danh sách hiện có. Nếu bạn hài lòng khi tạo chuỗi mới, tôi chắc chắn sẽ sử dụng list.Take(4) theo đề xuất của Adam, có hoặc không có cuộc gọi ToList. Những ngày này tôi có xu hướng để xây dựng các truy vấn chứ không phải là đột biến bộ sưu tập hiện có)

+0

differnce là danh sách ở đây ban đầu được thay đổi ... – Tigran

+0

+1 để trả lời câu hỏi trực tiếp, nhưng tôi đồng ý với ý kiến ​​truy vấn của bạn. Tôi tìm thấy một danh sách/mảng/bộ sưu tập mới được yêu cầu trên một số liệt kê trong các trường hợp ít hơn và ít hơn những ngày này. –

+0

@jon để làm rõ phương pháp này sẽ xóa các phần tử khỏi danh sách chỉ còn lại bốn phần đầu tiên. Nếu vậy điều này là hoàn hảo, cảm ơn :) – swade1987

9

Ngoài ra, bạn có thể tạo một danh sách mới với các mục từ cũ:.

var firstFour = myList.Take(4).ToList(); 

Điều này tạo ra một danh sách mới, tuy nhiên, vì vậy là không phải giống như xóa khỏi danh sách gốc.

Hoặc nếu tất cả các bạn cần làm là lặp họ, chỉ cần Take mà không ToList bên trong một foreach:

foreach (var item in myList.Take(4)) 

Bạn sau đó nhận được thực hiện chậm và không dành bộ nhớ trên tạo danh sách.

Cũng giống như một mặt lưu ý, với LINQ và LINQ mở rộng Tôi tìm mã tuyên bố của bạn ý định một cách rõ ràng hơn: list.Take(4) đọc dễ dàng hơn rất nhiều so với list.RemoveRange(4, list.Count - 4); trong nháy mắt. Ý định trong mã là rất quan trọng để bảo trì và làm việc theo nhóm.

0

Sử dụng Take của LINQ.

myList = myList.Take(4).ToList() 

Điều này có 4 mục đầu tiên trong danh sách của bạn và gán danh sách mới thay cho danh sách cũ của bạn.

Không cần kiểm tra độ dài như trong các câu trả lời khác vì "Hãy liệt kê các yếu tố nguồn và sản lượng cho đến khi các yếu tố đếm đã được tạo hoặc nguồn không chứa nhiều phần tử hơn." lịch sự Adam Houldsworth

+0

Vâng, nó gán nó vào một danh sách * mới * thay cho cái cũ - sẽ được gắn cờ cho GC giả định đây là tham chiếu duy nhất cho nó. Nó không có gì trong cùng một danh sách ngoài việc lặp lại 4 mục đầu tiên của nó. –

+0

@AdamHouldsworth: Cảm ơn và đã sửa. –

0

Hãy thử điều này

List<string> lstTest = new List<string>(); 
      lstTest.Add("test1"); 
      lstTest.Add("test2"); 
      lstTest.Add("test3"); 
      lstTest.Add("test4"); 
      lstTest.Add("test5"); 
      lstTest.Add("test6");   

      lstTest.RemoveRange(4, lstTest.Count - 4); 

      foreach (string item in lstTest) 
      { 
       Console.Write(item); 
      } 
      Console.ReadLine(); 
Các vấn đề liên quan