当前位置: 首页 > news >正文

List和 ObservableCollection 的区别

1. 变更通知机制​

  • ObservableCollection<T>
    实现了INotifyCollectionChangedINotifyPropertyChanged接口,当集合元素被添加、删除、替换或重置时,会自动触发CollectionChanged事件,通知绑定的UI控件更新(如WPF的DataGridListBox)。动态添加元素时,UI无需手动刷新即可同步显示新数据。

  • List<T>
    无内置变更通知机制。修改集合内容(如AddRemove)后,需手动调用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>
    非线程安全,需通过DispatcherSynchronizationContext在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方法(如WhereOrderBy),适合复杂数据查询与转换。


​总结

​需求场景​​推荐集合类型​
UI数据绑定 + 实时更新ObservableCollection<T>
后台数据处理 + 高性能操作List<T>
多线程环境 + 手动同步List<T> + 锁机制
批量操作 + 减少事件触发ObservableRangeCollection(第三方库)

6

若需在两者间转换,可通过构造函数直接初始化:

var observableList = new ObservableCollection<T>(existingList);
var list = observableList.ToList();

参考:

  1. 【三】ObservableCollection 与 List 的区别
  2. C#中 List和 ObservableCollection 的主要区别
  3. C# 基础(十)举例说明ObservableCollection(比如ListView绑定时更新集合时,只能用ObservableCollection)和List的区别,非常有用
  4. C#集合类ObservableCollection与List的区别和使用
  5. 向ObservableColletion - UWP C#添加项目
http://www.dtcms.com/a/307570.html

相关文章:

  • 【worklist】worklist的hl7、dicom是什么关系
  • 原生安卓与flutter混编的实现
  • 如何使用一台电脑adb调试多个Android设备
  • AI 如何评价股票:三七互娱(SZ:002555),巨人网络(SZ:002558)
  • 解决:MATLAB 已经画好了Figure,想在不重新绘图的情况下去掉坐标轴刻度线
  • Java 大视界 -- Java 大数据在智能医疗远程健康监测与疾病预防预警中的应用(374)
  • 《以终为始,不辩过程》
  • cartographer 概率栅格地图
  • JVM面试通关指南:内存区域、类加载器、双亲委派与GC算法全解析
  • 一万字讲解Java中的IO流——包含底层原理
  • GCC/G++ + Makefile/make 使用
  • Visual Studio调试技巧与函数递归详解
  • “0 成本开跨境店” 噱头下的优哩哩:商业模式深度剖析
  • 5G 单兵终端 + 无人机:消防应急场景的 “空 - 地” 救援协同体系
  • 【可用有效】Axure RP 9 授权码
  • imx6ull-驱动开发篇5——新字符设备驱动实验
  • springcloud04——网关gateway、熔断器 sentinel
  • cas自定义返回信息和自定义认证
  • 考研408_数据结构笔记(第三章栈、队列和数组)
  • 解构衡石嵌入式BI:统一语义层与API网关的原子化封装架构
  • Vue 中使用 Dexie.js
  • 城市客运安全员证考试难不难?如何高效备考
  • CUDA系列之常用Runtime API简介
  • BatchNorm 一般放在哪里?
  • Ⅹ—6.计算机二级综合题19---22套
  • 接口自动化测试以及requests
  • TS语法最佳实践
  • 【笔记】热力学定律推导(6)热力学第二定律推导
  • 【MATLAB】(二)基础知识
  • Golang 指针