2010-02-07 24 views
6

Tôi có một LinkedList các nút, mỗi nút lưu trữ một LinkedList các cạnh. Tôi muốn thực hiện điều gì đó dọc theo các dòng củaC#: Tại sao LinkedList không có một phương thức RemoveAll có một biến vị ngữ?

nodes.RemoveAll(n => n.edges.Count == 0) 

Nhưng không có RemoveAll ở đó. Tôi không hiểu tại sao nó không có nó, vì các bộ sưu tập khác làm. Điều này sẽ phải lặp qua tất cả các phần tử và chỉ loại bỏ từng phần một từ những gì tôi hiểu, điều này sẽ không có hiệu quả xấu đối với danh sách được liên kết.

Bây giờ tôi phải làm điều này thay vì:

for (LinkedListNode<MyNode> n2 = nodes.First; n2 != null;) 
{ 
    LinkedListNode<MyNode> temp = n2.Next; 
    if (n2.Value.edges.Count == 0) 
     nodes.Remove(n2); 
    n2 = temp; 
} 

Trong khi nó hoạt động, nó làm cho mọi thứ dường như phức tạp hơn những gì họ đang có.

+0

Đã hỏi - http://stackoverflow.com/questions/133487/how-do-i-remove-elements-from-a-linkedlist-in-c-that-match- a-given-criteria – ChrisF

+2

@Chri sF: Không hoàn toàn giống nhau - câu hỏi đó chỉ là loại bỏ một phần tử chứ không phải tất cả các phần tử. –

+0

Có lẽ việc tạo một LinkedList mới chỉ với Edges.Count> 0 sẽ nhanh hơn (thay vì thực hiện tất cả những hành động Remove trên danh sách cũ). Giải pháp Mark Byers bên dưới sẽ thực hiện. – Zyphrax

Trả lời

8

Tôi không thể nói tại sao phương thức đó không tồn tại. Nó có vẻ là một phương pháp hữu ích để có. Bạn có thể tự thêm nó bằng cách sử dụng một phương pháp mở rộng. Dưới đây là của tôi (có thể là xấu, và không được kiểm tra) nỗ lực làm điều đó:

public static class LinkedListExtensions 
{ 
    public static void RemoveAll<T>(this LinkedList<T> linkedList, 
            Func<T, bool> predicate) 
    { 
     for (LinkedListNode<T> node = linkedList.First; node != null;) 
     { 
      LinkedListNode<T> next = node.Next; 
      if (predicate(node.Value)) 
       linkedList.Remove(node); 
      node = next; 
     } 
    } 
} 

Sau đó, công trình này:

nodes.RemoveAll(n => n.edges.Count == 0); 

Hoặc bạn có thể đảo ngược tiêu chí để lựa chọn các yếu tố bạn muốn giữ lại và thực hiện một mới LinkedList từ họ:

nodes = new LinkedList<MyNode>(nodes.Where(n => n.edges.Count != 0)); 
Các vấn đề liên quan