C# ObservableCollection和List的区别
一、ObservableCollection和List的区别
1)ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged
Collection:为泛型集合提供基类。
INotifyCollectionChanged:将集合的动态更改通知给侦听器,例如,何时添加和移除项或者重置整个集合对象。
INotifyPropertyChanged:向客户端发出某一属性值已更改的通知。
所以再ObservableCollection这个类的方法,对数据的操作很少,重点放在了当自己本事变化的时候(不管是属性,还是集合)会调用发出通知的事件。(一般用于更新UI,
当然也可以用于写其他的事情。这个以后会写)
2)List就比较多了,继承了IList, ICollection, IEnumerable, IList, ICollection, IEnumerable。
IList:表示可按照索引单独访问的一组对象。
ICollection:定义操作泛型集合的方法。
IEnumerable:公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。
IList:表示可按照索引单独访问的对象的非泛型集合。
ICollection:定义所有非泛型集合的大小、枚举器和同步方法。
IEnumerable:公开枚举器,该枚举器支持在非泛型集合上进行简单迭代。
二、举例:
1、举例1:
MainWindow.xaml:
<ListBox x:Name="listbind" Height="61" HorizontalAlignment="Left" Margin="146,12,0,0" VerticalAlignment="Top" Width="120" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox x:Name="observbind" Height="74" HorizontalAlignment="Left" Margin="146,111,0,0" VerticalAlignment="Top" Width="120" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock Height="23" HorizontalAlignment="Left" Margin="38,58,0,0" Name="textBlock1" Text="List绑定数据" VerticalAlignment="Top" />
<TextBlock Height="44" HorizontalAlignment="Left" Margin="12,125,0,0" Name="textBlock2" Text="ObservableCollection绑定数据" VerticalAlignment="Top" Width="112" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="77,211,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
xaml页面很简单,托2个listbox分别用来绑定ObservableCollection和List
Person.cs:
1 public class Person
2 {
3 public string Name { get; set; }
4 }
MainWindow.xaml.cs:
private List<Person> person1 = new List<Person>();
private ObservableCollection<Person> person2 = new ObservableCollection<Person>();
public DemoTestDiff()
{
InitializeComponent();
person1.Add(new Person() { Name = "张三" });
person1.Add(new Person() { Name = "李四" });
listbind.ItemsSource = person1;
person2.Add(new Person() { Name = "张三" });
person2.Add(new Person() { Name = "李四" });
observbind.ItemsSource = person2;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
person1.Add(new Person() { Name = "王五" });
person2.Add(new Person() { Name = "王五" });
}
运行程序点击button按钮,然后只有ObservableCollection的有添加。
表示当集合对象的集合改变时,只有ObservableCollection会发出通知更新UI。
这只是他们两个区别之一。
2、举例2
以下方法可以更新ListView的UI:
private ObservableCollection<PreviewListModel> _previewList = new ObservableCollection<PreviewListModel>();
/// <summary>
/// 预览信息列表
/// </summary>
public ObservableCollection<PreviewListModel> PreviewList
{
get { return _previewList; }
set { SetProperty(ref _previewList, value); }
//set { _previewList = value; RaisePropertyChanged("PreviewList"); }
}
三、 ObservableCollection和List的互相转换
https://www.cnblogs.com/warioland/archive/2011/11/08/2240858.html
从数据库检索的出来的集合是List<T>类型,我们需要把它转成ObservableCollection类型怎么办?如下方法:
T tList = new List(tObjectStruct .ToList());
ObservableCollection tObjectStruct = new ObservableCollection(tList);
数据库检索:
public void AdvancedSearchFunc(AdvancedSearchNotification advancedSearchNotification)
{
try
{
KrayMobileDREntities dataBase = new KrayMobileDREntities();
//每次使用前必须清零
patientInfoHistroryModel.Clear();
//先把数据库的数据提取出来,放到集合中。
List<PatientInfo_Table> patientInfoList =
dataBase.PatientInfo_Table.Where(u => u.PatientKey.ToString().Equals(advancedSearchNotification.PatientInfo)
|| u.PatientID.ToString().Equals(advancedSearchNotification.StudyID)
|| u.PatientName.ToString().Equals(advancedSearchNotification.PatientName)
).ToList();
List<PatientStudy_Table> patientStudyList = dataBase.PatientStudy_Table.Where(u => u.PatientKey < 10).ToList();
//按条件检索集合
List<PatientInfoHistroryModel> list =
(from pI in patientInfoList
where (pI.PatientKey < 1000)
select new PatientInfoHistroryModel()
{
PatientInfo = pI.PatientKey.ToString(),
StudyID = pI.PatientID.ToString(),
PatientName = pI.PatientName.ToString(),
PatientSex = pI.PatientSex.ToString(),
PatientAge = pI.PatientAge.ToString(),
PatientBrith = pI.PatientBirthDate.ToString(),
PatientHeight = pI.PatientHeight.ToString(),
PatientWeight = pI.PatientWeight.ToString(),
RecordSource = pI.PatientSource.ToString(),
//StudyTime = PS.StudyDatetime,
//EquipmentType = PS.StudyPhysician,
//StudyPart = PS.StudyType,
//SequenceAmount = PS.SeriesCount,
StudyTime = pI.PatientAge.ToString(),
EquipmentType = pI.PatientAge.ToString(),
StudyPart = pI.HangFlag.ToString(),
SequenceAmount = pI.HangFlag.ToString(),
StudyStutas = pI.StudyCompleteFlag.ToString(),
SuspendState = pI.HangFlag.ToString(),
FilmPrint = pI.PrintFlag.ToString(),
}).ToList();
patientInfoHistroryModel = list;
dataBase.Dispose();
}
catch (Exception ex)
{
MessageBox.Show("病人历史记录信息表【高级查询】状态下,发生数据库错误。错误信息:--------------" + ex.ToString());
LogHelper.Error("OperateDataSheetViewModel.cs::AdvancedSearchFunc()高级查询失败--" + ex.Message);
}
}
四、总结
1、ObservableCollection表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。
2、List表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。(大部分操作用Linq,很强大也很方便。)
参考连接:
https://blog.csdn.net/xpj8888/article/details/84782949
C# ObservableCollection和List的区别相关推荐
- 来看看C# ObservableCollection和List的区别
聊聊C# ObservableCollection和ListObservableCollection这个类的方法,对数据的操作很少,重点放在了当自己本事变化的时候(不管是属性,还是集合)会调用发出通知 ...
- C# ObservableCollection和List的区别总结
C# ObservableCollection和List的区别总结 一.继承的类和接口,还有它们的方法不同 1)ObservableCollection比较简单,继承了Collection, INot ...
- ObservableCollection和List的区别总结
一.继承的类和接口,还有它们的方法不同 1)ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPrope ...
- 《深入浅出WPF》笔记——绑定篇(一)
上一节,有记录写到:在WPF里,数据驱动UI,数据占核心地位,UI次之.怎么恢复数据的核心地位,那就要先了解一下Binding. 一.Binding 基础 1.1WPF中Data Binding的带来 ...
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...
问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...
- RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...
- C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...
- gcc 和 g++ 的联系和区别,使用 gcc 编译 c++
GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...
- Python2 与 Python3 区别
Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...
最新文章
- 回顾Node文件路径
- 秒杀 高并发 类型系统方案设计
- 添加一个hello wrold系统调用到内核
- Graphviz-Gdot语言学习
- SAP fiori backend determine cache setting
- spring aop不执行_使用Spring AOP重试方法执行
- 领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型
- Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
- gssapiauthentication
- mysql怎么添加默认约束_分享知识-快乐自己:MySQL中的约束,添加约束,删除约束,以及一些其他修饰...
- 【前端项目】<开发实战>一个小而精致的个人简历
- C语言判断完数(完整版)
- 2021年网络工程师考试大纲
- 科学计算机算ph,科学计算器TechCalc v4.8.0特别高级会员版
- 如何在北京购车外地上牌
- 计量经济学及Stata应用 陈强 第八章自相关习题8.3
- 计算机组成原理中动态RAM与静态RAM的比较
- 【HTML作业】HTML设计--电影网站,影视网站
- Intellij IDEA2019版激活方式
- windows找不到麦克风的解决方法
热门文章
- HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)
- 前端JavaScript规范
- SQL Server中,with as使用介绍
- shell中source与sh区别
- 32 commons-lang包学习
- [原]TCP/UDP使用细节备忘
- [转载]Javascript异步编程的4种方法
- 基于'sessionStorage'与'userData'的类session存储
- 进程handle获取线程_获取进程中的线程列表
- 使用Java实现K-Means聚类算法