2012-07-27 36 views
9

Tại sao ObservableCollection không có phương thức RemoveAll như số List?Tại sao ObservableCollection không có phương thức RemoveAll?

Tôi đã triển khai phương thức mở rộng để cung cấp chức năng này cho ObservableCollection, nhưng tôi muốn hiểu xem có lý do cụ thể nào không cung cấp chức năng này không.

Nó có thể có hiệu lực Ràng buộc dữ liệu theo cách nào đó do Thay đổi bộ sưu tập? This bài viết chỉ định một vài điều có thể xảy ra trong khi sử dụng ObservableCollections, nhưng không giải quyết câu hỏi này.

+1

Bạn đã xem phương thức Clear() chưa? (http://msdn.microsoft.com/en-us/library/ms132405.aspx) – Eirik

+0

Nó có phương thức Clear(), loại bỏ tất cả các phần tử trong Bộ sưu tập. – Dante

+1

Vâng, phương thức RemoveAll() không nhằm xóa bộ sưu tập. Ngay cả Danh sách cũng có phương thức Clear(). Nó được thiết kế để loại bỏ tất cả các mục phù hợp với một tiêu chí nhất định. –

Trả lời

17

Phương thức này có thể xóa tất cả các mục mà bạn có thể sử dụng thay thế.

Nếu tôi đã phải đánh bạo đoán là tại sao họ đã sử dụng Clear thay vì RemoveAll, tôi nghĩ rằng nó sẽ là vì RemoveAll mang ý kiến ​​cho rằng bạn đang xóa mục từ bộ sưu tập, trong khi Clear cho bạn biết các mục được chỉ đơn giản là bị xóa .

Điều này tạo sự khác biệt về loại thông báo CollectionChanged được nêu lên. Clear() đặt ra sự kiện NotifyCollectionChangedAction.Clear và không bao gồm các mục đã xóa trong sự kiện, trong khi Remove tăng sự kiện NotifyCollectionChangedAction.Removed và chuyển mục đã xóa cho sự kiện.

You cannot raise a CollectionChanged event with multiple items, vì vậy, hãy tăng sự kiện NotifyCollectionChangedAction.Removed với tất cả các mục đã xóa sẽ ném một ngoại lệ. Cách khác là tăng sự kiện CollectionChanged cho mọi mục đã bị xóa, điều này có thể khá tệ đối với hiệu suất. Và chỉ đơn giản là nâng cao sự kiện NotifyCollectionChangedAction.Reset sẽ gây ra một số nhầm lẫn khi người dùng mong đợi sự kiện Removed xảy ra khi họ xóa các mục.

Vì vậy, tôi đoán họ đã quyết định chỉ cần sử dụng .Clear() thay vì .RemoveAll() vì tên là mô tả tốt hơn về những gì thực sự xảy ra phía sau hậu trường.

+0

Tôi nghĩ rằng điều này giải thích nó. Cảm ơn lời giải thích chi tiết như vậy. –

1

Bạn cũng có thể hỏi tại sao nó không thực hiện Reverse hoặc bất kỳ phương pháp nào khác. Đơn giản là không có lý do để thực hiện nhiều hơn các phương pháp phổ biến nhất và tuyệt đối cần thiết. Mọi thứ bên cạnh AddRemove chỉ là tiện lợi. (RemoveAll thậm chí không phải là một phần của giao diện phổ biến liệt kê việc triển khai và chúng có rất nhiều phương thức rồi)

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