2012-12-19 35 views
12

Tôi có hai bộ sưu tập dữ liệu trong hai mô hình khác nhau thực hiện giao diện kho lưu trữ. Một trong số đó nằm trong một danh sách phẳng phù hợp với mô hình Repository. Mô hình dữ liệu khác được định dạng trong một cấu trúc cây và việc triển khai giao diện kho lưu trữ mà tôi xây dựng trông rất râm mát. Tôi có thể cố gắng làm phẳng mô hình dữ liệu thứ hai và chỉ sử dụng tài liệu tham khảo cho cha mẹ nhưng hiện tại ứng dụng có một số lợi ích lớn từ việc có thể lấy dữ liệu dưới dạng cấu trúc cây.Thực hiện mẫu lưu trữ với mô hình dữ liệu trong cấu trúc cây

Điều tôi muốn biết liệu ai đó có kinh nghiệm triển khai mẫu kho lưu trữ với mô hình dữ liệu có cấu trúc cây hay không. Hiện nay trong phương pháp Get(Func<T, bool> predicate) của tôi tôi san bằng danh sách với một phương pháp đệ quy và trả về đối tượng với một truy vấn LINQ nhưng tôi cảm thấy như việc thực hiện này là một chút tốn kém.

Bất kỳ mẹo nào về cách triển khai điều này sẽ được đánh giá cao.

Dưới đây là việc triển khai phương thức get bằng phương pháp dự báo nếu điều đó giúp minh họa các sillines của việc triển khai.

protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    var objects = GetAll<T>(); 
    return objects.Where(predicate); 
} 

EDIT: một số mã khác

private IEnumerable<TreeData> GetRecursiveObjects(TreeData object) 
    { 
     var allChildren = new List<TreeData>(); 
     allChildren.AddRange(object.Children); 

     foreach (var child in object.Children) 
     { 
      allChildren.AddRange(GetRecursiveObjects(child).ToArray()); 
     } 
     return allChildren; 
    } 

    protected virtual IEnumerable<T> GetAll<T>() 
    { 
     var objects = new List<T>(); 
     objects.AddRange(Objects); 
     foreach (var object in Objects) 
     { 
      objects.AddRange(GetRecursiveObjects(object)); 
     } 
     return objects.OfType<T>(); 
    } 

Second chỉnh sửa:

Tôi cũng là một chút nhầm lẫn về những gì một chiến lược tốt để thêm các yếu tố để kho sẽ. Tôi có nên xử lý việc thêm vào con của phần tử cha trong mã sử dụng hay không nên kho chứa cả phần tử và tham chiếu đến phần tử đó và xử lý toàn bộ hoạt động thêm?

tl; dr

Có điên không để thử triển khai giao diện kho chứa dữ liệu trong cấu trúc cây?

+1

Câu trả lời cho câu hỏi của bạn thực sự phụ thuộc vào cấu trúc cây của bạn và cách bạn thực sự tra cứu dữ liệu của mình. Bạn có thể cung cấp thêm một chút chi tiết không? – James

+0

Các phương pháp GetAll đi trough trẻ em đệ quy và thêm chúng vào một danh sách. – Moriya

+0

Chỉ vì sự tò mò của tôi: tại sao bạn nhấn mạnh vào việc làm phẳng cấu trúc? Tại sao kho lưu trữ không thể/không nên trả về một cấu trúc giống cây? –

Trả lời

4

Bạn có thể viết một phương pháp đi bộ trên cây và trả lại một IEnumerable<T> bằng cách sử dụng khối lặp (yield return).

Sau đó, bạn sẽ không cần phải tạo ra một "phẳng" bộ sưu tập các nội dung của cây của bạn và bạn chỉ có thể sử dụng LINQ to Objects để áp dụng ngữ của bạn:

protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    return WalkAll().Where(predicate); 
} 

Trong thực tế, các truy vấn LINQ wouldn thậm chí không được đánh giá cho đến khi mã khách hàng liệt kê nó.

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