2010-11-16 59 views
58

Tôi có rất nhiều thực thể có lồng nhau List<> trong mỗi. Ví dụ: Tôi có BaseEntityList<ColumnEntity>. ColumnEntity lớp học có List<Info> và cứ tiếp tục như vậy.ObservableCollection <> vs. List <>

Chúng tôi đang làm việc với một giao diện người dùng WPF và chúng tôi cần theo dõi tất cả các thay đổi trong mỗi Danh sách BaseEntity. Nó được thực hiện bằng cách instantiating một new ObservableCollection dựa trên danh sách cần thiết, và với ràng buộc với rằng ObservableCollection.

Ưu và khuyết điểm thay đổi tất cả các lồng nhau Lists thành ObservableCollections là gì? Vì vậy, chúng tôi có thể theo dõi tất cả các thay đổi trong số BaseEntity mà không phải gán lại mỗi danh sách BaseEntity cho các ràng buộc được sửa đổi ObservableCollection?

Giả sử rằng các phương pháp cụ thể cho List không bao giờ được sử dụng.

Trả lời

64

Câu hỏi thú vị, xem xét cả Danh sách và ObservableCollection triển khai IList<T> không có nhiều khác biệt ở đó, ObservableCollection cũng triển khai giao diện INotifyCollectionChanged, cho phép WPF liên kết với nó.

Một trong những khác biệt chính là ObservableCollection không có phương pháp AddRange, có thể có một số tác động.

Ngoài ra tôi sẽ không sử dụng ObservableCollection cho những địa điểm mà tôi biết mình sẽ không ràng buộc, vì lý do này quan trọng là phải xem xét thiết kế của bạn và đảm bảo rằng bạn đang sử dụng đúng cách.

Theo như sự khác biệt giữa Collection<T>List<T> bạn có thể có một cái nhìn ở đây Generic Lists vs Collection

+1

Liên kết bị hỏng ... – Assimilater

+0

Tôi đã sửa liên kết và thay đổi đã được phê duyệt. – Joe

29

Nó phụ thuộc vào chính xác những gì bạn có nghĩa là bằng cách này:

chúng ta cần phải theo dõi tất cả những thay đổi trong mỗi Danh sách của BaseEntity

Có đủ để theo dõi các thay đổi đối với các đối tượng đã có trong danh sách không? Hay bạn cần biết khi nào các đối tượng bị xóa khỏi/được thêm vào/thay đổi vị trí trong danh sách?

Nếu danh sách sẽ chứa cùng một mục cho toàn bộ thời gian của chúng, nhưng các đối tượng riêng lẻ trong danh sách đó sẽ thay đổi, thì chỉ đủ đối tượng để tăng thông báo thay đổi (thường là thông qua INotifyPropertyChanged) và List<T> là đủ. Nhưng nếu danh sách sẽ chứa các đối tượng khác nhau theo thời gian hoặc nếu thứ tự thay đổi, thì bạn nên sử dụng ObservableCollection<T>.

Vì vậy, mặc dù sự khác biệt có thể thú vị (và áp phích trước đã bao gồm), thông thường bạn sẽ không có nhiều lựa chọn - hoặc bạn cần ObservableCollection<T> hoặc bạn không cần.

+3

Ý nghĩ độc đáo. +1 – Subby

5

Tôi thấy không có vấn đề gì với điều đó, ngoài chi phí hiệu năng rất cận biên.

Lưu ý rằng nếu bạn sửa đổi trực tiếp Danh sách nội bộ, bạn sẽ không được thông báo về các thay đổi.Ngoài ra nếu các đối tượng được chứa trong ObservableCollection được sửa đổi, bạn sẽ không được thông báo. Thông báo chỉ xảy ra, nếu các yếu tố được thêm vào, thay thế, xóa hoặc di chuyển.

9

Danh sách thể hiện danh sách đối tượng được nhập mạnh mẽ có thể được truy cập theo chỉ mục. Nó cung cấp các phương thức để tìm kiếm, sắp xếp và thao tác các danh sách. Lớp List là tương đương chung của lớp ArrayList. Nó thực hiện giao diện chung IList bằng cách sử dụng một mảng có kích thước được tăng động theo yêu cầu.

Quan sátCollection là bộ sưu tập dữ liệu động chung chung sử dụng giao diện "INotifyCollectionChanged" để cung cấp thông báo khi các mục được thêm, xóa hoặc khi toàn bộ bộ sưu tập được làm mới.

đọc thêm về nó trong liên kết này: http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha

3

Thêm một khác biệt quan trọng là bạn có thể truy cập vào ObservableCollection chỉ từ chủ đề mà nó được tạo ra nơi như danh sách có thể được truy cập fromany chủ đề.

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