zoukankan      html  css  js  c++  java
  • 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是一个很深奥的主题.

  • 相关阅读:
    INT最值
    约瑟夫问题
    word里的图片怎么复制出来
    必须掌握的8个dos命令
    vld(Visual Leak Detector 内存泄露检测工具
    sscanf,sscanf_s及其相关用法
    游戏开发梦开始的地方笔记
    关于字符编码,你所需要知道的
    CreateMutex创建互斥体可以用于只运行进程的一个实例
    sprintf,你知道多少?
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6632017.html
Copyright © 2011-2022 走看看