1. 变更通知机制
ObservableCollection<T>
实现了INotifyCollectionChanged
和INotifyPropertyChanged
接口,当集合元素被添加、删除、替换或重置时,会自动触发CollectionChanged
事件,通知绑定的UI控件更新(如WPF的DataGrid
、ListBox
)。动态添加元素时,UI无需手动刷新即可同步显示新数据。
List<T>
无内置变更通知机制。修改集合内容(如Add
、Remove
)后,需手动调用OnPropertyChanged
或重新赋值整个集合才能触发UI更新。
2. 适用场景
ObservableCollection<T>
- UI数据绑定:WPF/UWP等需要实时同步数据的场景(如聊天消息列表、实时监控仪表盘)。
- MVVM架构:作为ViewModel中的集合属性,实现Model与View的自动同步。
List<T>
- 后台数据处理:高频操作(如批量导入、算法计算),无需UI响应的场景。
- 临时数据存储:缓存、排序等纯内存操作,追求更高性能。
3. 性能与内存
ObservableCollection<T>
- 因维护事件机制,内存占用略高。
- 单元素操作(如
Add
)会触发事件,频繁操作可能导致性能损耗,建议批量操作时使用ObservableRangeCollection
扩展。
List<T>
- 基于动态数组实现,随机访问速度快,但中间插入/删除需移动元素,可能影响性能。
- 无事件开销,适合高频增删改查。
4. 线程安全性
ObservableCollection<T>
非线程安全,需通过Dispatcher
或SynchronizationContext
在UI线程修改集合,避免跨线程异常。
Application.Current.Dispatcher.Invoke(() => collection.Add(item));
List<T>
同样非线程安全,需手动加锁(如lock
语句)保护多线程访问。
5. 功能扩展性
示例:ObservableCollection<T>
支持与CollectionViewSource
结合,实现筛选、排序等高级视图功能。var cvs = new CollectionViewSource { Source = collection }; cvs.View.Filter = item => ((Person)item).Age > 18;
List<T>
提供丰富的LINQ方法(如Where
、OrderBy
),适合复杂数据查询与转换。
总结
需求场景 | 推荐集合类型 |
---|---|
UI数据绑定 + 实时更新 | ObservableCollection<T> |
后台数据处理 + 高性能操作 | List<T> |
多线程环境 + 手动同步 | List<T> + 锁机制 |
批量操作 + 减少事件触发 | ObservableRangeCollection (第三方库) 6 |
若需在两者间转换,可通过构造函数直接初始化:
var observableList = new ObservableCollection<T>(existingList);
var list = observableList.ToList();