List和ObservableCollection的相互转化

本文深入探讨了在WPF、Silverlight、WP7中如何使用List<T>和ObservableCollection<T>,并详细介绍了它们之间的转换方法以及各自的优缺点,旨在帮助开发者更高效地进行数据管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在WPF , silverlight ,WP7中经常会用到List<T>和ObservableCollection<T>。这里简单讲一下他们之间的相互转换。

1.List<T>的简单介绍:

List<T>代表的是强类型的Ojbect集合,可以通过索引访问并且提供了查找、排序以及操作此集合的方法。List基本上和ArrayList相同,它用数组的方式实现了接口IList并且他的大小可以根据需要来自动增加。

List<T>的缺点

在使用ASP.NET开发时,我们简单的使用DataSource和DataBind来绑定数据,但是在SilverLight中就没有那么简单了。在ASP.NET中,绑定操作只是单向的。绑定操作一旦完成如果再想改变值的话,你必须得弹出一个已经赋值需要修改的对话框或者直接在表单上修改,最后再调用方法DataBind,这样的操作特别的麻烦。

2.ObservableCollection的介绍:

ObservableCollection是动态数据集合并且当集合中新增、修改或者删除项目时,或者集合被刷新时,都有通知机制(通过实现接口INotifyCollectionChanged)。

ObservableCollection的缺点

当集合中的属性中改变时没有提供任何的通知机制。在程序运行的过程中,通过新增、删除或者改变ObservableCollection集合中的数据时,只有新增和删除数据时,UI集合(DataGrid)中的数据才改变。但是在修改集合中已经存在的数据时UI层的数据却不能改变。

3.这里不得不提一下子INotifyPropertyChanged,它不是集合,只是一个接口。在类中提供一个事件PropertyChanged,当属性的值发生改变时通知客户端。如果对象的状态发生改变时(新增、修改、删除)将触发事件PropertyChange指向那些已经发生改变的集合。

ObservableCollection能通知他变化了也正是因为它实现了INotifyPropertyChanged接口。只是微软给出了具体的实现,如果要写List需要自己实现 INotifyPropertyChanged接口,

说了这么多,言归正传,对于它们互换:
T tList = new List(tObjectStruct .ToList());
ObservableCollection tObjectStruct = new ObservableCollection(tList);
都在构造函数中即可完成
也可以:
tList.ForEach(p => tObjectStruct.Add(t));

### C# 中 List ObservableCollection 的主要区别 #### 数据变更通知机制 `List<T>` 是一种通用集合类,提供了存储操作对象列表的功能。然而,它并不具备自动通知界面或其他订阅者的能力来反映其内部数据的变化。这意味着如果 `List<T>` 被绑定到 UI 控件上,在更改其中的数据时(如添加、移除或修改项),UI 不会自动刷新以显示这些变化[^2]。 相比之下,`ObservableCollection<T>` 实现了 `INotifyCollectionChanged` 接口以及 `INotifyPropertyChanged` 接口。这使其能够在任何项目被添加、移除或者整个集合发生重置时触发相应的事件通知。因此当此类型的实例用于数据绑定情境下——特别是像 WPF 或 UWP 这样的框架环境中——它可以确保每当基础数据发生变化时,关联的视图也会同步更新[^1]。 #### 线程安全性考虑 另一个值得注意的区别在于线程安全方面。虽然两者本身都不是完全线程安全的设计,但在多线程环境下处理它们的方式有所不同。对于 `List<T>` 来说,开发人员通常需要自行管理锁机制或者其他形式的手动同步措施来保护访问;而对于 `ObservableCollection<T>` ,尽管它的基本操作也不是天生线程安全的,但由于经常结合 MVVM 架构模式应用于 GUI 应用程序中,所以在实际应用过程中往往通过 Dispatcher 队列等方式间接实现了某种程度上的单一线程约束,从而减少了直接面对复杂并发控制的需求。 #### 性能对比分析 从性能角度来看,由于每次变动都会引发一系列的通知过程,所以频繁地对大容量的 `ObservableCollection<T>` 执行增删改动作可能会带来额外开销。而在相同条件下单纯使用 `List<T>` 则不会有这样的负担,因为它只负责维护内存中的结构而不涉及外部通信逻辑。故而在那些不需要实时反馈至前端展示层的应用场合里,选用后者可能更加高效合理一些[^2]。 ```csharp // 使用 List<T> 示例 var list = new List<string>(); list.Add("Item"); Console.WriteLine(list.Count); // 输出数量不会引起界面反应 // 使用 ObservableCollection<T> 示例 var observableCollection = new ObservableCollection<string>(); observableCollection.CollectionChanged += (s, e) => Console.WriteLine($"Change detected: {e.Action}"); observableCollection.Add("NewItem"); // 添加新条目并触发 CollectionChanged 事件 ``` ### 结论 综上所述,选择哪种集合取决于具体应用场景的要求。如果是构建桌面应用程序并且希望简化双向数据绑定流程,则推荐优先采用 `ObservableCollection<T>` 。但如果目标仅限于后台服务端编程或者是其他无需关心用户交互体验的地方的话,那么继续沿用简单轻量级的 `List<T>` 就足够满足需求了。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值