2013-03-23 43 views
8

Có cách nào thuận tiện để xóa danh sách lồng nhau khỏi danh sách khác nếu nó đáp ứng các yêu cầu nhất định không? Ví dụ: giả sử chúng tôi có một tập hợp các điểm dừng và chúng tôi quyết định gọi mỗi bộ sưu tập các điểm dừng là một tuyến đường. Mỗi tuyến đường nằm trong danh sách từ. Sau đó, chúng tôi quyết định đặt từng tuyến đường vào một danh sách.C# Xóa danh sách khỏi danh sách

Vì vậy, bây giờ chúng tôi có danh sách các tuyến đường, ai đó quyết định rằng một số loại tuyến đường nhất định thực sự không nên được đưa vào danh sách tuyến đường. Làm thế nào tôi có thể loại bỏ các tuyến đường? Dưới đây là một số mẫu mã:

Ví dụ Lớp

public class Stops 
{ 
    public Stops(int _param1, string _param2) 
    { 
     param1 = _param1; 
     param2 = _param2; 
    } 

    public int param1 { get; set; } 
    public string param2 { get; set; } 
} 

Tạo Danh mục

List<List<Stops>> lstRoutes = new List<List<Stops>>(); 
List<Stops> lstStops = new List<Stops>(); 
List<Stops> lstMoreStops = new List<Stops>(); 

// Create some stops 
for (int i = 0; i < 5; i++) 
{ 
    lstStops.Add(new Stops(i, "some text")); 
} 

lstRoutes.Add(lstStops); 

// Create some more stops 
for (int i = 5; i < 10; i++) 
{ 
    lstMoreStops.Add(new Stops(i, "some more text")); 
} 

lstRoutes.Add(lstMoreStops); 

Làm thế nào tôi có thể loại bỏ bất kỳ tuyến đường từ lstRoutes có, nói rằng, bất kỳ giá trị param1 lớn hơn 6?

Trả lời

7

đơn giản nhất cách (có thể áp dụng đối với tất cả enumerables, không chỉ liệt kê):

lstRoutes = lstRoutes.Where(r => !r.Any(s => s.param1 > 6)).ToList(); 

Điều này tạo ra một danh sách mới do đó, một sao chép sẽ xảy ra. Cách hiệu quả nhất sẽ là "không thêm" các mục đó vào danh sách ở vị trí đầu tiên. Thứ hai hiệu quả nhất sẽ được xóa mục khỏi danh sách riêng của mình thay vì xây dựng một hình mới:

lstRoutes.RemoveAll(r => r.Any(s => s.param1 > 6)); 
+0

Hà Tôi ước gì có thể tránh thêm chúng vào danh sách ở tốc độ đầu tiên. Thật không may, danh sách bắt đầu là một loạt các hoán vị và tôi có nhiệm vụ loại bỏ các hoán vị không có ý nghĩa. Đoạn mã đầu tiên bạn đăng đã ném lỗi sau: Không thể chuyển đổi biểu thức lambda thành loại vì nó không phải là loại đại biểu. NHƯNG bit thứ hai làm việc tuyệt vời. Cảm ơn nhiều! –

+0

bạn có biết làm thế nào tôi có thể nhận được chỉ số của param1? Tôi biết trong trường hợp này nó sẽ luôn luôn là 0, nhưng nói rằng mỗi tuyến đường bao gồm một loạt các số nguyên, và tôi muốn loại bỏ tất cả các tuyến đường mà 6 xảy ra trước khi 7. Nếu không, không có vấn đề lớn. Tôi sẽ tìm ra hoặc bắt đầu một câu hỏi khác. –

+0

đã tìm ra. Cảm ơn một lần nữa vì sự giúp đỡ của bạn. –

0
List<Stops> stop = lstRoutes.Find(delegate(List<Stops> stp) { return stp.param1 > 6; }); 
+0

Cảm ơn rất nhiều vì phản hồi, nhưng tôi dường như không thể làm được điều này. Tôi nhận được lỗi sau: 'System.Collections.Generic.List ' không chứa định nghĩa cho 'param1' và không có phương pháp mở rộng 'param1' chấp nhận đối số đầu tiên của loại 'Dừng' có thể được tìm thấy. –

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