C#编程(六十)----------LINQ的概述
LINQ的概述
LINQ的全名为语言继承查询,是VS2008个.NET3.5版中一款突破性的创新,他再对象领域和数据领域之间架起了一座桥梁.使用LINQ能大大加快对于对象数据等等的查询,加快效率.
由于低版本的VS不支持LINQ,我是用的VS2012,案例如下:
public class ObjDataItem
{
public string Name { get; set; }
public int Value { get; set; }
public DateTime CreateDate { get; set; }
}
然后用一个List<ObjDataItem>objects来存放实例化的ObjDataItem数据.要对这个List<T>进行查找有三种常用的方法来查找, 以下对三种方法进行介绍:
(1)遍历List<T>中的每个ObjDataItem对象,对比是否符合查找条件.
(2)使用List<T>的FindAll方法来潮找符合条件的对象集
(3)使用LINQ来查找符合条件的对象集.
先假设查找条件是ObjDataItem对象的name属性的值是”a”,三种方法查找的代码列出来看看.
(1)遍历查找方法:
List<ObjDataItem> items = new List<ObjDataItem>();
List<ObjDataItem> ObjData = new List<ObjDataItem>();
foreach (ObjDataItem item in items)
{
if (item.Name.ToLower() == "a")
ObjData.Add(item);
}
(2)List<T>的FindAll方法查找
List<T>的FindAll的定义是:
public List<T> FindAll(Predicate<T> match)
其中Predicate是一个委托,表示定义一组条件并确定指定对象是否符合这些条件的方法.
public delegate bool Predicate<T> (T obj)
所以使用List<<T>的FindAll来查找对象就需要编写实例Predicate<T>的方法.
private string _SearchName;
private bool FindByName(ObjDataItem obj)
{
if (obj.Name.ToLower() == _SearchName.ToLower())
return true;
else
return false;
}
然后就可以使用List<T>的FindAll方法来查找符合条件的对象。
public List<ObjDataItem> SearchAllByName(string name)
{
_SearchName = name;
List<ObjDataItem> items = Objects.FindAll(FindByName);
return items;
}
(3)使用LINQ查找对象
使用LINQ来查找符合条件的对象方便了很多,代码如下:
IEnumerable<ObjDataItem> items =
from objdataitem in ObjData.Instance.Objects
where objdataitem.Name.ToLower() == "a"
select objdataitem;
从上面代码来看遍历查找是最好理解的,使用FindAll复杂了不少,而使用LINQ则有点奇怪,看上去有点象SQL语句,这三种方法均能得到正确的结果,但是执行速度却相差很大。通过示例程序计算的时间方法(1)是方法(2)的时间的9倍左右,方法(2)是方法(3)的21倍左右。从面可见使用LINQ是既方便又快速!
如果没有LINQ,筛选出姓名为小明的People对象则需要一个List,然后遍历整个列表,降负荷丁丁雕件的People对象放入列表.到那时有了LINQ,这部分筛选就变得很容易,甚至只要一句话就能完成.如果觉得这个例子不够说明LINQ对生产力有重大贡献的话,那么我们的鸡的皮就会下降百分之五十.
LINQ特指形如from...where..select这样的代码,其返回值是IQueryable<T>或IEnumerable<T>.
LINQ to SQL是.NET3.5内置的一个轻量级O/R Mapping解决方案,可以将数据表映射为实体对象,方便开发人员对数据库的操作.可见, LINQ事实上只是LINQ的一个实现,提供了一个可以查询SQL Server数据库的LINQ Provider.
LINQ Provider是LINQ查询的执行器,标准LINQ语法支持很多的操作符,但是某个具体的LINQ实现可能只支持其中的一部分.在.NET3.5默认提供了三种LINQ Provider,分别是LINQ to Object , LINQ to SQL , LINQ to XML.
LINQ to XXX表示使用LINQ针对XXX这种数据进行查询的解决方案.我们可以定义自己的LINQ Provider,使用我们自定义的查询规则来处理特定数据集.目前网上可以找大哦数十种LINQ Provider,而已经处于beta 3阶段的ADO.NET Framework,最终也会提供了LINQ Provider,叫做 LINQ to Entities.
总结:
LINQ提高效率,方便在特定集合中寻找单条记录,避免使用foreach循环,频繁的数据库查询,可以根据实际的开发案例适当的使用.
开发中需要循环处理一个集合中的每条记录时,我们可以把相应的数据统一放到内存的一个List集合中,然后使用LINQ获取单条记录进行业务处理.这样做的好处是效率提高了.
C#编程(六十)----------LINQ的概述的更多相关文章
- C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- C#高级编程六十六天----表达式树总结【转】
https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代 ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- [.net 面向对象编程基础] (20) LINQ使用
[.net 面向对象编程基础] (20) LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...
随机推荐
- 安装numpy只需一步简单的方法
因为最近在搞机器学习,涉及到python,因为我的python版本还是windoes下的2.7版本,在学习K临近算法的时候,需要安装numpy函数,下面就把自己的安装方法写下来 1:登录网址 htt ...
- opencv的级联分类器(mac)
级联分类器的介绍:级联分类器训练 因为要训练负样本,windows电脑有些问题,所以就只能有mac进行训练. 在windows中训练,准备了负样本之后,进行三步. 1.opencv_createsam ...
- MySQL问题解决:-bash:mysql:command not found
问题: [root@linux115 /]# mysql -uroot -p -bash: mysql: command not found www.2cto ...
- [转] 使用moment.js轻松管理日期和时间
当前时间:moment().format('YYYY-MM-DD HH:mm:ss'); 2017-03-01 16:30:12 今天是星期几:moment().format('d'); 3 Unix ...
- 【BZOJ】4292: [PA2015]Równanie
题解 \(f(n)\)的取值范围最多\(9^2 * 18\) 直接枚举判断就好 代码 #include <bits/stdc++.h> #define fi first #define s ...
- 几种常见类的使用(System,Runtime,Math,Date,Calendar,Random)
一:System 1.介绍 System:类中的方法和属性都是静态的. out:标准输出,默认是控制台. in:标准输入,默认是键盘. 2.properties 获取系统属性信息:Properties ...
- vue播放video插件vue-video-player实现hls, rtmp播放全过程
1.安装插件 1 npm install vue-video-player -S 2.配置插件 在main.js里添加 1 import VideoPlayer from 'vue-video-pla ...
- [转]关于一些SPFA的标程
SPFA算法 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. 最短路径快速算法-SPFA算法是西南交通大学段凡丁于1994年发表的. 适用范围:给定 ...
- RPO漏洞学习
不能直接复制markdown上来真的是痛苦,图片还要手动上传. 算了,不贴了. 这是PDF版https://files.cnblogs.com/files/r00tuser/RPO%E6%BC%8F% ...
- HTTP协议-缓存
HTTP 协议中,缓存更多关心的文档资源的再利用.其目的是减少数据传输,加快相应速度等等.而对于缓存采用的是什么方案,也就是存在内存中还是硬盘中之类的问题,就属于另外的内容了. 假设,我身在广东,但是 ...