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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MS-SQLSERVER--错用了LEN()函数

sqlserver数据导入oracle时发现字符长度不对。。下面是两个函数的区别&#xff1a;DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符&#xff08;而不是字节&#xff09;个数&#xff0c;其中不包含尾随空格转载于:https://www.cnblogs.com/yooplmqj/…

rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

原文托管在Github: https://github.com/shellhub/blog/issues/52数据结构与算法之线性表-顺序表实现(C语言版本)前言数据结构与算法是一个程序员必备的技能之一,而顺序表更是每个程序员在面试过程中要经常被问到的&#xff0c;如Java语言中的ArrayList类的底层实现就是使用顺序…

浅析 record 使用场景

浅析 record 使用场景Intro之前我们有介绍过 record 基本知识&#xff0c;可以参考 C# 9 新特性 — record 解读&#xff0c;record 会实现基于值的类型比较&#xff0c;最近遇到的几个问题觉得用 record 来解决会非常方便&#xff0c;分享一下基于值的类型比较最近有遇到一个场…

jax rs mysql_Jersey / JAX-RS ExceptionMapper MySQL

我正在学习Jersey / JAX-RS&#xff0c;我需要一些ExceptionMapper的帮助 .我有一个UserFacade类&#xff0c;AbstractFacade类和User类本身&#xff0c;都非常标准&#xff0c;主要是通过在Netbeans中创建一个带有Database的新Web Service RestFUL项目生成的 . 我的问题是&…

hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读

安装Hadoop软件系列&#xff0c;首选Linux系统&#xff0c;比如Ubuntu。如果你的系统是Windows&#xff0c;建议再安装一个Ubuntu&#xff0c;组成双系统&#xff0c;如此可以发挥各自系统的特点。使用U盘制作一个系统&#xff0c;拿出一块分区用作新装的系统&#xff0c;开机启…

后宫佳丽三千,假如古代皇帝也懂负载均衡算法...

古代皇帝&#xff0c;后宫佳丽三千&#xff0c;没法做到雨露均沾&#xff0c;但为了繁衍后代&#xff0c;子嗣繁盛&#xff0c;弱水三千&#xff0c;只取一瓢饮显然是不行的。不同的朝代有不同的宠幸妃子的方法&#xff0c;著名的有羊车望幸、掷筛侍寝、翻牌悬灯等等。如果皇帝…

常见DDoS技术方法和对应防御措施

DDOS***是现在最常见的一种******方式&#xff0c;下面就给大家简单介绍一下DDOS的七种***方式。 1.Synflood: 该***以多个随机的源主机地址向目的主机发送SYN包&#xff0c;而在收到目的主机的SYN ACK后并不回应&#xff0c;这样&#xff0c;目的主机就为这些源主机建立了大…

mac 配置php和mysql_Mac下配置PHP+MySql环境

由于最近需要布置mantis用来进行bug追踪&#xff0c;在此记录其过程。由于PHP apache环境在Mac OS上是自带的&#xff0c;所以不需要另处下安装包&#xff0c;只需要简单配置一下即可。首先打开终端输入命令&#xff1a;sudo vim /etc/apache2/httpd.conf其中有一行是这样的#Lo…

git使用的基本流程_git命令的基本使用

首先下载完git之后打开Git Bash配置你的邮箱和用户名&#xff08;github或gitee&#xff09;&#xff1a;$ git config --global user.name "注册时账号的名字"$ git config --global user.email "注册时使用的邮箱"获取ssh公钥&#xff1a;ssh-keygen -t …

软件性能测试与LoadRunner实战可以在网上和书店买到了

有很多朋友和学员对这本书已经期待很久了&#xff0c;今天可以幸福的告诉大家这本书&#xff0c;您可以在China-pub上订购了&#xff08;订购的链接&#xff1a;[url]http://www.china-pub.com/39876[/url]&#xff09;&#xff0c;也可以在书店买到喽。下面是专业人事的书评内…

Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言

还记得五年前的夏天&#xff0c;我在巨硬写着世界上最好的语言&#xff0c;有时也需要带着游标卡尺写着另一门语言。然而&#xff0c;我对这两门语言都不熟悉&#xff0c;如果能在 VS Code 中方便快捷地运行各种语言&#xff0c;那岂不是很方便&#xff1f;于是&#xff0c;我就…

mysql group where_[MySQL] 测试where group by order by的索引问题

1. select * from test where axx group by b order by c 如何加索引CREATE TABLE index_test (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL DEFAULT ,gid int(11) NOT NULL DEFAULT 0,age int(11) NOT NULL DEFAULT 0,PRIMARY KEY (id)) ENGI…

gpl可以商用吗_一文看懂开源许可证,能不能商用再也不抓瞎

在github中闲逛&#xff0c;宝藏多福利好。不过心里或许总有小忐忑&#xff0c;这么多开源项目&#xff0c;我的产品里能不能用呀&#xff01;其实想知道项目能不能用看下项目的开源许可证就清楚了(即使是非软件产品比如数据、媒体、资料等也可以通过开源许可证知道它们的可用范…

使用 Tye 辅助开发 k8s 应用竟如此简单(一)

最近正巧在进行 Newbe.Claptrap 新版本的开发&#xff0c;其中使用到了 Tye 来辅助 k8s 应用的开发。该系列我们就来简单了解一下其用法。安装 Tye 首先&#xff0c;确保已经正确安装了 netcore 2.1 或以上版本的 dotnet SDK。Tye 目前还处于开发阶段&#xff0c;因此&#xff…

np变题了。但我过了

前天5月14号&#xff0c;一个平静的日子。我去参加了np的bsci考试&#xff0c;但不幸的是一进去看到考题就发晕了。题变了&#xff0c;后来才知道&#xff0c;我去考试的时间是变题的第二天。但万幸的是经过艰苦的努力&#xff0c;我终于看到了Congratulations&#xff0c;出来…

mysql修改主键生成策略信息_常用Hibernate 主键生成策略

1.AssignedAssigned方式由程序生成主键值&#xff0c;并且要在save()之前指定否则会抛出异常特点&#xff1a;主键的生成值完全由用户决定&#xff0c;与底层数据库无关。用户需要维护主键值&#xff0c;在调用session.save()之前要指定主键值。2.HiloHilo使用高低位算法生成主…

php上传文件很慢的原因_PHP编码安全:上传文件安全

一次性付费进群&#xff0c;长期免费索取教程&#xff0c;没有付费教程。进微信群回复公众号&#xff1a;微信群&#xff1b;QQ群&#xff1a;460500587教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍 微信公众号&#xff1a;计算机与网络安全ID&#xff1a;Computer-net…

RabbitMQ 入门:2. Exchange 和 Queue

上文RabbitMQ 入门&#xff1a;1. Message Broker&#xff08;消息代理&#xff09;提到过 RabbitMQ 实现了 AMQP 这个协议&#xff08;RabbitMQ 所支持的 AMQP 的版本是 0.9.1&#xff09;&#xff0c;这个协议的内容很多&#xff0c;但为了构建入门级的分布式应用&#xff0c…

【组图】地震前线归来--心中的震撼

5.12号获悉家乡发生大地震&#xff0c;不放心在成都的家人朋友&#xff0c;于13日从北京赶回成都&#xff0c;再了解事态严重性&#xff0c;并确定家人情况后&#xff0c;14日与众多志愿者一起从成都出发&#xff0c;取道彭州市&#xff0c;通济镇&#xff0c;白水河镇&#xf…

mysql数据库密码错误_MySQL数据库经典错误六 数据库密码忘记的问题

数据库密码忘记的问题[rootzs ~]# mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user ‘root’’localhost’ (using password: YES)[rootzs ~]# mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user ‘root’’localhost’ (…