2012-08-08 20 views
10

Tôi muốn lưu trữ một sơ đồ tổ chức trong một bộ sưu tập. Tôi nghĩ rằng cấu trúc dữ liệu cây sẽ phù hợp nhất với nhu cầu của tôi, vì tôi cần thêm nhiều nút vào một nút.Bộ sưu tập nào để lưu trữ cấu trúc cây?

LinkedList chỉ cung cấp thêm một nút cho nút khác, nếu tôi hiểu chính xác.

Tôi đã xem bộ sưu tập C5 treeset, nhưng dường như không có phương pháp Add() để thêm nhiều hơn 2 nút vào một nút.

Tôi cũng đã xem Treeview lớp từ thư viện Biểu mẫu Windows, nhưng tôi không muốn thêm biểu mẫu Windows dll vào dự án của mình, vì tôi đang xây dựng một ứng dụng lớp dịch vụ. (hoặc là nó tốt?)

Tôi không muốn viết lớp sưu tập cây của riêng mình, nếu đã có một lớp do bên thứ ba cung cấp?

Bất kỳ đề xuất nào vui lòng?

Cảm ơn

+0

có thể trùng lặp của http://stackoverflow.com/questions/66893/tree-data -cấu trúc-in-c-sắc nét? – ikh

+0

Cảm ơn ikh Tôi đã thấy liên kết đó, nhưng tôi không muốn tạo bộ sưu tập của riêng mình. Phải có ai đó ở đó đã tạo ra một dll và phân phát nó thông qua Nuget! – gunnerz

+1

Vấn đề với các bộ sưu tập giống cây được dựng sẵn là không có thỏa thuận về giao diện được chấp nhận chung. Không giống như danh sách, bộ hoặc từ điển, cây cối và đồ thị có thể có các giao diện khác nhau tùy thuộc vào ai đang triển khai chúng và cho mục đích nào họ cần để sử dụng chúng. C# làm cho nó khá dễ dàng để cuộn của riêng bạn, và đó là một cái gì đó tôi chắc chắn sẽ khuyên bạn nên làm trong tình huống của bạn. – dasblinkenlight

Trả lời

24

Điều gì đó như thế này có thể là điểm khởi đầu. Bằng việc sử dụng Generics này có thể tổ chức một cây bất cứ điều gì

class TreeNode<T> 
{ 
    List<TreeNode<T>> Children; 

    T Item {get;set;} 

    public TreeNode (T item) 
    { 
     Item = item; 
    } 

    public TreeNode<T> AddChild(T item) 
    { 
     TreeNode<T> nodeItem = new TreeNode<T>(item); 
     Children.Add(nodeItem); 
     return nodeItem; 
    } 
} 

Một mẫu nắm giữ một cây dây

string root = "root"; 
TreeNode<string> myTreeRoot = new TreeNode<string>(root); 
var first = myTreeRoot.AddChild("first child"); 
var second = myTreeRoot.AddChild("second child"); 
var grandChild = first.AddChild("first child's child");