C#编程(六十八)----------LINQ小结
LINQ小结
一.LINQ是什么
LINQ也就是Language Interrated Query的缩写,怎么一个缩写法我也不明白,即语言集成查询,是微软在.NET3.5中提出的一项新技术,LINQ主要包含四个组件,下面看一下LINQ的一个架构图:
简单的介绍一些四个组件:
1.Linq to SQL 组件----可以查询基于关于数据的数据(微软本身只是实现了对SQL Server的查询,可以对数据库中的数据进行查询,修改,插入删除,排序等操作)
2.LINQ to Dataset组件----可以查询Dataset对象中的数据,并对数据进行增删改查的操作
3.LINQ to Objects组件----可以查询IEnumerable或IEnumerable<T>集合
4.LINQ to XML 组件----可以查询和操作XML文件,比Xpath操作和XML更加方便
二.使用LINQ的好处是啥
上面说到LINQ的四个组件,分笔试对不同数据进行增删改查的一些操作,然而以前也是有相关技术对这些数据进行操作,(例如,对数据库的操作,之前有ADO.NET对其进行支持,对XML的操作,之前也可以Xpath来操作XML文件等),此时应该大家会有个疑问,为什么以前都有相关技术对其支持,我们还要学习LINQ呢,对于这个疑问答案很简单,Linq 使操作这些数据源更加简单,方便和易于理解,之前的技术操作起来过于繁琐,所以微软也有上进心啊,希望可以做的更好啊,所以就在C# 3中提出了Linq来方便大家操作这些数据源,下面通过对比来说明Linq是如何简单方便:
2.1查询集合中的数据
之前我们查询集合中的数据一般会使用for或者foreach语句来进行查询,而LINQ实用查询表达式来进行查询,LINQ表达式比之前用for或foreach的方式更加简洁,比较容易添加筛选条件,下面就具体看看两者方式的比较代码(假设一个场景----返回集合中序号为偶数的元素)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LINQ小结
{
class Program
{
static void Main(string[] args)
{
OldQuery();
LinqQuery();
Console.ReadKey();
}
//使用foreach返回集合中序号为偶数的元素
public static void OldQuery()
{
Console.WriteLine("使用老方法来对集合对象查询,查询结果为:");
//初始化查询的集合
List<string> collection = new List<string>();
for (int i = 0; i < 10; i++)
{
collection.Add("A"+i.ToString());
}
//创建保存查询结果的集合
List<string> queryResults = new List<string>();
foreach (var item in collection)
{
//获取元素序号
int index = int.Parse(item.Substring(1));
//查询序号为偶数的元素
if (index%2==0)
{
queryResults.Add(item);
}
}
foreach (var item in queryResults)
{
Console.WriteLine(item);
}
}
//使用LINQ返回集合中序号为偶数的元素
public static void LinqQuery()
{
Console.WriteLine("使用Linq方法来对集合对象查询,查询结果为:");
//初始化查询的数据
List<string> collection = new List<string>();
for (int i = 0; i < 10; i++)
{
collection.Add("A" + i.ToString());
}
//创建查询表达式来获得序号为偶数的元素
var queryResults = from s in collection
let index = int.Parse(s.Substring(1))
where index % 2 == 0
select s;
// 输出查询结果
foreach (string s in queryResults)
{
Console.WriteLine(s);
}
}
}
}
从上面的连个方法比较中可以看出使用LINQ对集合查询时确实简单了很多,并且也容易添加筛选条件(只需要在where后面添加额外的筛选条件即可),运行结果当然也是我们期望的.
2.2查询XML文件
之前我们大部分都会使用XPath来对XML文件进行查询,然而使用XPath来查询XML文件需要首先知道XML文件的具体结构,而LINQ查询表达式在查询XML数据是,可以不需要知道XML文件结构,并且编码更加简单,容易添加判断的条件,下面就具体代码来说明适用LINQ查询的好处(这里假设一个场景----有一个定义Persons的XML文件,现在我们要求查找出XML文件中Name节点为”李四”的元素):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
namespace LINQ小结
{
class Program
{
static void Main(string[] args)
{
OldLinqToXMLQuery();
UsingLinqToXMLQuery();
Console.ReadKey();
}
// 初始化XML数据
private static string xmlString =
"<Persons>" +
"<Person Id='1'>" +
"<Name>张三</Name>" +
"<Age>18</Age>" +
"</Person>" +
"<Person Id='2'>" +
"<Name>李四</Name>" +
"<Age>19</Age>" +
"</Person>" +
"<Person Id='3'>" +
"<Name>王五</Name>" +
"<Age>22</Age>" +
"</Person>" +
"</Persons>";
//使用Xpath方式来对XML文件进行查询
private static void OldLinqToXMLQuery()
{
Console.WriteLine("使用Xpath方式来对XML文件进行查询");
//导入XML文件,这里需要使用命名空间System.Xml
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
//创建查询XML文件的XPath
string xPath = "/Persons/Person";
//查询Person元素
XmlNodeList queryNodes = xmlDoc.SelectNodes(xPath);
foreach (XmlNode node in queryNodes)
{
//查询名字为李四的元素
foreach (XmlNode childNode in node.ChildNodes)
{
if (childNode.InnerXml=="李四")
{
Console.WriteLine("姓名为: " + childNode.InnerXml + " Id 为:" + node.Attributes["Id"].Value);
}
}
}
}
//使用LINQ来对XML文件进行查询
private static void UsingLinqToXMLQuery()
{
Console.WriteLine("使用LINQ来对XML文件进行查询");
//相同的步骤,导入XML文件,需要导入命名空间 System.Xml.Linq;
XElement xmlDoc=XElement.Parse(xmlString);
//创建查询,获取姓名为"李四"的元素
var queryResults = from element in xmlDoc.Elements("Person")
where element.Element("Name").Value == "李四"
select element;
// 输出查询结果
foreach (var xele in queryResults)
{
Console.WriteLine("姓名为: " + xele.Element("Name").Value + " Id 为:" + xele.Attribute("Id").Value);
}
}
}
}
使用XPath方式来查询XML文件时,首先需要知道XML文件的具体结构(代码中需要指定XPath为”/Persons/Person”,这就说明必须知道XML的组成结构了),然而使用LINQ方式却不需要知道XML文档结构,并且从代码书写的量中也可以看出使用LINQ方式的简洁性.
使用LINQ的好处:
a.LINQ查询表达式使用上更加简单,而且也易于理解(没有接触过LINQ的人也可以大致才出代码的意图)
b.LINQ提供了更多的功能,我们可以查询,排序,分组,增加和删除等操作数据的大部分功能.
c.可以使用LINQ处理多种数据源,也可以为特定的数据源定义自己的LINQ实现.
三.LINQ的实际操作例子----使用LINQ遍历文件目录
前面简单的的寿命了使用LINQ的强大和好处,以下介绍一下LINQ具体可以做些什么,如果大家做一个文件管理系统的时候,大家都需要便利文件目录吧,下面就是用LINQ来查找在文件目录中是否存在特定的文件:案例如下:
最好提前在桌面上新建一个Desttop文件夹
Desttop文件夹 text.txt mytext文件夹 text文件夹 text.txt text.txt
代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LINQ遍历文件
{
class Program
{
static void Main(string[] args)
{
//查找桌面上是否存在制定文件
string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
FileQuery2(desktop);
if (!string.IsNullOrEmpty(FileQuery()))
{
Console.WriteLine(FileQuery());
}
else
{
Console.WriteLine("电脑桌面上不存在test.txt文件");
}
Console.ReadKey();
}
//使用Linq查询
private static string FileQuery()
{
Console.WriteLine("使用Linq查询");
string deskTopDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//获取指定目录和子目录中的文件名
string[] fileNames = Directory.GetFiles(deskTopDir,"*.*",SearchOption.AllDirectories);
List<FileInfo> files = new List<FileInfo>();
foreach (var item in fileNames)
{
files.Add(new FileInfo(item));
}
var results = from file in files
where file.Name == "test.txt"
select file;
// 输出查询结果
StringBuilder queryResult = new StringBuilder();
foreach (var result in results)
{
queryResult.AppendLine("文件的路径为: " + result.FullName);
}
return queryResult.ToString();
}
//使用递归来查找文件
private static void FileQuery2(string path)
{
Console.WriteLine("使用递归来查找文件");
//获得指定目录中的文件(包含子目录)
string[] filenames = Directory.GetFiles(path);
List<FileInfo> files = new List<FileInfo>();
foreach (var item in filenames)
{
files.Add(new FileInfo(item));
}
var results = from file in files
where file.Name == "test.txt"
select file;
//输出查询结构
StringBuilder queryResylts = new StringBuilder();
foreach (var item in results)
{
Console.WriteLine("文件的路径为: " + item.FullName);
}
// 获得所有子目录
string[] dirs = Directory.GetDirectories(path);
if (dirs.Length > 0)
{
foreach (string dir in dirs)
{
FileQuery2(dir);
}
}
}
}
}
使用并行的LINQ可以轻松的并行化运行时间较长的查询.
另一个比较重要的概念是表达式树.表达式树允许在运行期间构建对数据源的查询,因为表达式树存储在程序集中.
LINQ是一个很深奥的主题.
C#编程(六十八)----------LINQ小结的更多相关文章
- 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...
- 《剑指Offer》题六十一~题六十八
六十一.扑克牌中的顺子 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2~10为数字本身,A为1,J为11,Q为12,K为13,而大.小王可以看成任意数字. 六十二.圆圈中 ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- C#编程(六十)----------LINQ的概述
LINQ的概述 LINQ的全名为语言继承查询,是VS2008个.NET3.5版中一款突破性的创新,他再对象领域和数据领域之间架起了一座桥梁.使用LINQ能大大加快对于对象数据等等的查询,加快效率. 由 ...
- C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- python六十八课——网络编程之UDP协议
1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...
- C#高级编程六十六天----表达式树总结【转】
https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代 ...
- 六十八、SAP中内表插入的三种方法之二,COLLECT的使用,用于计算数字字段之和
一.使用COLLECT时,如果关键字没有,那么插入,如果有则求所有关键字列的和,代码如下 二.sy-index在循环中,每次循环从1开始递增 三.查看T_DATA数据 四.如下 五.循环时候,我们查看 ...
- SpringBoot进阶教程(六十八)Sentinel实现限流降级
前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...
随机推荐
- 如何动态修改windows下的host文件
事件背景:为了测试数据提交后,需要在另一个环境的多个测试节点下去验证测试数据是否添加成功,找了一大堆放法,用了比较笨的方法实现了.不多废话思路如下: 为了万无一失,先备份hosts文件内容: 1.读取 ...
- 转载 http://blog.csdn.net/dengta_snowwhite/article/details/6418384
从SDCard保存的txt文件读取中文到android系统中会出现乱码问题,如何解决这个乱码问题,网上有不少解答方法,譬如说利用String temp1 =EncodingUtils.getStrin ...
- Python_oldboy_自动化运维之路_socket编程(十)
链接:http://www.cnblogs.com/linhaifeng/articles/6129246.html 1.osi七层 引子: 须知一个完整的计算机系统是由硬件.操作系统.应用软件三者组 ...
- ORM,DAO,MVC,POJO
1.ORM 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间 ...
- 入门NodeJS
入门NodeJS https://www.cnblogs.com/dotnetcrazy/p/10118756.html NodeJS 1.环境配置 之前讲ES6的时候有提过一部分Node的知识,简单 ...
- 【LOJ】#2182. 「SDOI2015」寻宝游戏
题解 终于了解怎么动态维护虚树了 就是把点按照dfs序排个序啊 这道题显然是求虚树上所有边长的两倍 我们把dfs序排完序,相邻两个点加上路径长(包括首尾),删除的时候删一个点减去它到两边再加上新近相邻 ...
- zookeeper集群自动启动脚本
定义脚本boot.sh启动zookeeper集群(hadoop1,hadoop2,hadoop3) #!/bin/bash echo "start zkServer..." do ...
- Android SDK platforms build-tools等镜像下载
Android SDK platforms build-tools等镜像下载 下载地址:http://mirrors.neusoft.edu.cn/android/repository/ 这 ...
- 001.Pip简介安装使用
一 PIP简介 pip类似RedHat里面的yum,使用PIP安装软件非常便捷快速. 二 PIP下载安装 方式一: [root@localhost ~]# yum install -y epel-re ...
- 隐马尔科夫模型(HMM)与词性标注问题
一.马尔科夫过程: 在已知目前状态(现在)的条件下,它未来的演变(将来)不依赖于它以往的演变 (过去 ).例如森林中动物头数的变化构成——马尔可夫过程.在现实世界中,有很多过程都是马尔可夫过程,如液体 ...