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

  • 相关阅读:
    Python元组、列表、字典
    测试通过Word直接发布博文
    Python环境搭建(windows)
    hdu 4003 Find Metal Mineral 树形DP
    poj 1986 Distance Queries LCA
    poj 1470 Closest Common Ancestors LCA
    poj 1330 Nearest Common Ancestors LCA
    hdu 3046 Pleasant sheep and big big wolf 最小割
    poj 3281 Dining 最大流
    zoj 2760 How Many Shortest Path 最大流
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6632017.html
Copyright © 2011-2022 走看看