2012-04-16 27 views
7

Cách nào dễ nhất để loại bỏ các mục phù hợp với một số điều kiện từ danh sách và sau đó, lấy các mục đó.LINQ: RemoveAll và xóa các thành phần

tôi có thể nghĩ trong một vài cách khác nhau, tôi không biết đó là tốt nhất:

var subList = list.Where(x => x.Condition); 
list.RemoveAll(x => x.Condition); 

hoặc

var subList = list.Where(x => x.Condition); 
list.RemoveAll(x => subList.Contains(x)); 

Là bất kỳ của điều này một trong những cách tốt nhất? Nếu có, cái nào? Nếu không, tôi nên làm như thế nào?

Trả lời

4

tôi sẽ đi với các tùy chọn đầu tiên cho các mục đích dễ đọc, với lưu ý rằng bạn nên thực hóa danh sách đầu tiên, hoặc bạn sẽ bị mất các mục rất bạn đang cố gắng để lựa chọn trên dòng tiếp theo:

var sublist = list.Where(x => x.Condition).ToArray(); 
list.RemoveAll(x => x.Condition); 

Ví dụ thứ hai là O (n^2) không có lý do gì và ví dụ cuối cùng là hoàn toàn tốt, nhưng ít có thể đọc được.

Chỉnh sửa: bây giờ tôi đọc lại ví dụ cuối cùng của bạn, lưu ý rằng vì nó được viết ngay bây giờ sẽ đưa ra mọi mục khác. Bạn đang thiếu kiểm tra điều kiện và dòng xóa thực sự là list.RemoveAt(i--); vì phần tử i+1 trở thành phần tử thứ i sau khi xóa và khi bạn tăng i, bạn sẽ bỏ qua nó.

+0

Nó thực sự O (n^3), nhưng tôi giả định thiếu materialization chỉ trượt tâm trí của bạn;) – Blindy

+0

Các mục (như tôi đã viết) có bị xóa khỏi danh sách con với lệnh thứ hai không? : O – Diego

+0

Er bạn không bao giờ xóa khỏi 'danh sách con', cũng như bạn không định đọc nếu tôi đọc chính xác. – Blindy

2

Tôi thích sử dụng phương pháp lập trình chức năng (chỉ thực hiện những điều mới, không sửa đổi những thứ hiện có). Một lợi thế của ToLookup là bạn có thể xử lý nhiều hơn một phần hai chiều của các mục.

ILookup<bool, Customer> lookup = list.ToLookup(x => x.Condition); 
List<Customer> sublist = lookup[true].ToList(); 
list = lookup[false].ToList(); 

Hoặc nếu bạn cần phải sửa đổi các ví dụ ban đầu ...

list.Clear(); 
list.AddRange(lookup[false]); 
+0

Tôi nghĩ rằng nó phức tạp hơn nhiều (và hầu như không có kiến ​​thức tôi nghĩ nó không thực sự hiệu quả). Điều này có lợi thế gì không? – Diego

+0

Điều kiện được đánh giá chính xác một lần cho mỗi mục.Ví dụ danh sách không được sửa đổi, có thể là một lợi thế lớn nếu cá thể danh sách đó được chia sẻ giữa các luồng. –

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