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是一个很深奥的主题.

时间: 2024-11-03 13:25:47

C#编程(六十八)----------LINQ小结的相关文章

Java编程思想(十八) —— 再谈反射

在Java编程思想(十五) -- 类型信息之反射和Java编程思想(十六) -- 联系JVM再谈Class,书上只用了3页就讲完了,还有讲了那么多Class的东西,接下来要从反射中怎么用,自己结合API和其他资料再写多一些. 示例:Test.java public class Test { public Test() {     }      public Test(int i) {         System.out.println(i);     } private void pri()

C#高级编程六十九天----DLR简介

DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象深刻. C#4动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务,它允许添加动态语言,如Ruby和Python,并使C#具备和这些动态语言相同的某些功能. 动态编程语言并非什么新鲜事物,早在面向对象编程语言成为主流之前,人们

一起talk C栗子吧(第一百六十八回:C语言实例--C语言中的布尔--bool类型)

各位看官们,大家好,上一回中咱们说的是控制终端字符颜色的例子,这一回咱们说的例子是:C语言中的布尔–bool类型 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在数字电路中我们经常会遇到布尔类型,其实在编写软件的过程中也会使用布尔类型.布尔类型的变量只有两种值:真和假.在实际的编程过程中,我们经常定义宏,然后使用1表示真,0表示假.下面是具体的例子: #define TRUE 1 #define FALSE 0 例子中定义了两个宏,一个是TRUE,它的值是1,表示真:另外一个是F

六十八个超级经典小故事

目录 1.  用人之道 2.  鹦 鹉 3. 袋鼠与笼子 4. 扁鹊的医术 5. 曲突徒薪 6. 救 人 7. 出 门 8. 鱼王的儿子 9. 河边的苹果 10. 右手握左手 11. 抉 择 12. 简单道理 13. 并不是你想象中那样 14. 养牛之道 15. 爱人之心 16. 给 予 17. 提醒自我 18. 窗 19. 习惯与自然 20. 留个缺口给别人 21. 马 22. 所长无用 23. 佛塔上的老鼠 24. 钢玻璃杯的故事 25. 机会 26. 疯子和呆子 27. 博士 28. 跳槽

C#高级编程六十四天----并行扩展

并行的扩展 扩展1. Parallel的使用: 在Parallel下面有三个常用的方法Invoke,For,ForEach Parallel.Invoke()方法是最简单,最简洁的将串行的代码并行化. 在这里先说一点,就是Stopwatch的使用,Stopwatch到底是个什么东西,首先Stopwatch在命名空间System.Diagnostics中. 使用方法如下: var StopWatch =new Stopwatch();//创建一个Stopwatch实例 StopWatch.Star

C#高级编程六十六天----表达式树总结

表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是很有用的.有其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 表达式树的语法: 考虑下面简单的Lambda表达式: Func<int,int,int>function=(a,b)=>a+b; 这个语法包含三个部分: 1.一个声明 : Func<int,int,int>function 2.一个等号 : =

C#高级编程六十七天----LINQ提供程序

LINQ提供程序 .NET3.5包含了几个LINQ提供程序. LINQ提供程序为特定的数据源实现了标准的查询操作符. LINQ提供程序也许会实现LINQ定义的更多扩展方法,但至少要实现标准操作符. LINQ to XML 不仅实现了专门用于XML 的方法,还实现了其他方法,例如System.Xml.Linq 命名空间的Extensions类定义的方法Elements(),Descendants 和Ancestors. LINQ提供程序的实现方案是根据命名空间和第一个参数的类型来实现的. 实现扩展

C#高级编程六十五天----表达式树

表达式树 以前没听过表达式树,只听过表达式,而且听过Lambda表达式,首先介绍一下.NET里表达式树的核心概念:讲代码作为数据,他将一些代码表示为一个对象树,树中的每个节点本身都是一个表达式,不同的表达式类型代表能在代码中执行不同操作:二元操作,一元操作,方法调用等等. System.Linq.Expression命名空间包含了代表表达式的各个类.所有的表达式类都从Expression 类派生,Expresssion是个抽象类,主要包括的是一些静态方法,这些方法用于生成其他表达式类的实例.Ex

three.js 源码注释(六十八)extras/geometries/BoxGeometry.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚开始学,好多地儿肯定不对还请见谅. 以下代码是THREE.JS 源码文件中extras/geometries/BoxGeometry.js文件的注释. 更多更新