linq语法基础使用示例

 更新时间:2014年01月07日 10:22:25   投稿:zxhpj  
LINQ语言集成查询(Language Integrated Query),是在.NET Framework 3.5 中出现的技术,借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据,下面学习一下他的使用方法

借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。从技术角度而言,LINQ定义了大约40个查询操作符,如from, select, in, where, group by, orderby, … 使用这些操作符可以编写查询语句。

做软件的,总想代码要怎么样才能更好地复用,要怎么样才更利于扩展,要怎么样更能以不变应万变。就如同微软框架所提供的API一样,在一定程度上避免开发者重复造轮子。拿LINQ来说吧,.NET Framework3.5及之后的版本都已经封装进去,供成千上百万的开发者使用。同一套LINQ语法,它能支持LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE。复用、减少开发工作量及降低学习成本等好处都是不言而喻的。LINQ的学习很像SQL,所以有使用过SQL语句的话,感觉还是蛮熟悉的。

上手简单是学习LINQ的一大好处,语法很像SQL语句的语法。而且学一种技术,可以当多种技术来使用。这是不是很像那种多功能刀,一刀在手,生活无忧。LINQ支持集合、XML、数据库的查询。写代码就像说话,多必失,所以呢,尽量优化自己的代码。这不但有利于减少错误的发生,也有利于提高生产率、降低维护的成本。而使用LINQ也是奔着这个方向发展。

LINQ是一种查询语言,所以呢,运用的场景当然也就是查询罗。查哪些,包括LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE。可以说查询的范围很广。每一种都可以出一系列的文章,我们这里主要还是讲 LINQ TO OBJECCT。

来看看从集合中,我们是怎么来查询需要的值。

复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqApplication
{
    class People
    {
        /// <summary>
        /// 名字
        /// </summary>
        public string FirstName { get; set; }
        /// <summary>
        /// 姓氏
        /// </summary>
        public string LastName { get; set; }
        /// <summary>
        /// 国家
        /// </summary>
        public string Country { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {

            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };
            List<People> result = new List<People>();

            foreach (People p in listPeople)
            {
                if (p.Country == "China")
                {
                    result.Add(p);

                }
            }

            foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }
    }
}

上面的方法可以说是最直接,最容易想到的方法。上面的实现怎么看也没有觉得有什么好复用的,但是事实是怎么样?就有牛人看出了名堂,善于归纳上面的问题就是判断是跟不是的问题,就想到要去提出来,供以后复用。 当然复用之路也不是一蹴而就的,也是日积月累而成。所以我们也来看看过渡的过程。

复制代码 代码如下:

/// <summary>
        /// 判断是否存在
         /// </summary>
        /// <param name="p">对象</param>
        public static bool IsExist(People p)
        {
            return p.Country == "China";
        }

如果说只是如下方式来实现的话,那还真是白费力气了。

复制代码 代码如下:

foreach (People p in listPeople)
            {
                if (IsExist(p))
                {
                    result.Add(p);
                }
            }

但是结合到委托的话,我们就可以把IsExist(People p)当成一个参数来进行传递。这里我们过渡再快一点,我们把查询的那一段代码提到另一类Helper供以后得用。我们来看看Helper类的代码实现。限于篇幅的问题,只截Helper类的方法。

复制代码 代码如下:

public class Helper
    {
        //声明委托
        public delegate bool ExistPeople(People p);


        /// <summary>
        /// 获取满足条件的数据
         /// </summary>
        /// <param name="listPeople">数据集</param>
        /// <param name="existPeople">条件</param>
        public static List<People> GetPeopleResult(IList<People> listPeople, ExistPeople existPeople)
        {
            List<People> result = new List<People>();
            foreach (People p in listPeople)
            {
                if (existPeople(p))
                {
                    result.Add(p);
                }
            }
            return result;
        }
    }

这样我们就可以直接调用,来获取满足条件的数据了。也可以使用C#2.0提供的匿名委托,还可以使用C#3.0的Lambda表述式。代码如下:

复制代码 代码如下:

static void Main(string[] args)
        {
            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };

            IList<People> result = new List<People>();

            //直接调用
              result = Helper.GetPeopleResult(listPeople, IsExist);
            //匿名委托
              //result = Helper.GetPeopleResult(listPeople, delegate(People p){ return p.Country == "China" ? true : false;});
            //Lambda表达式
              //result = Helper.GetPeopleResult(listPeople, people => people.Country == "China");          

            foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }

讲到这里,对于具体集合的查询基本上是完成了,但是呢,C#3.0还提供了一种方法,使调用的代码更加直观,那就是扩展方法。通过扩展IList集合的方法,我们就可以通过IList来调用并传递委托条件即可。

Helper类的扩展代码如下:

复制代码 代码如下:

public static class Helper
    {
        //声明委托
        public delegate bool ExistPeople(People p);


        /// <summary>
        /// 获取满足条件的数据
        /// </summary>
        /// <param name="listPeople">数据集</param>
        /// <param name="existPeople">条件</param>
        public static IList<People> GetPeopleResult(this IList<People> listPeople, ExistPeople existPeople)
        {
            List<People> result = new List<People>();
            foreach (People p in listPeople)
            {
                if (existPeople(p))
                {
                    result.Add(p);
                }
            }
            return result;
        }
    }

我们看Main方法的调用,是不是很直观了,就像调用集合的方法,并给传递委托条件即可了。Main方法如下:

复制代码 代码如下:

static void Main(string[] args)
        {
            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };

            IList<People> result = new List<People>();

            //直接调用
              //result = Helper.GetPeopleResult(listPeople, IsExist);
            //匿名委托
              //result = Helper.GetPeopleResult(listPeople, delegate(People p){ return p.Country == "China";});
            //Lambda表达式
              //result = Helper.GetPeopleResult(listPeople, people => people.Country == "China");
            //扩展方法调用
              result = listPeople.GetPeopleResult(people => people.Country == "China");

            foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }

上面是使用GetPeopleResult方法名,但是我们想要的话,是不是就可以实现诸如Select、Where、OrderBy等方法了。基本上方法的介绍就已经完了。但是有一个大的问题,那就是它还比较死,不灵活,因为我们不可能说每个集合里面的对象(本文是People)都重复来写。这里肯定是需要提供一种方式,使它能够接受不同的对象,这样才有利于我们复用。因为IList继承自IEnumerable,所以可以给IEnumerable实现扩展方法,然后利用泛型的特征,就可以给不同的对象来复用,代码如下:

复制代码 代码如下:

public static class Helper
    {
        public delegate bool Condtion<T>(T t);
        public static IEnumerable<T> GetPeopleResult<T>(this  IEnumerable<T> items, Condtion<T> condition)
        {
            foreach (T t in items)
            {
                if (condition(t))
                {
                    //C# 2.0里出现的一个关键字,返回一个迭代器
                    yield return t;
                }
            }
        }
    }

Main方法就不贴全部了,毕竟上面都重复好几回,只贴调用那一句:

复制代码 代码如下:

IEnumerable<People> result = Helper.GetPeopleResult<People>(listPeople, people => people.Country == "China");

而C# 3.0则给我们提供var关键字,被称为推断类型。
var 关键字能指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类型或任何表达式。所以上面的式子可以写成如下方式:

复制代码 代码如下:

var result = Helper.GetPeopleResult<People>(listPeople, people => people.Country == "China");

正式结束

相关文章

  • C#实现XOR密码(异或密码)的示例代码

    C#实现XOR密码(异或密码)的示例代码

    XOR密码(异或密码)是一种简单的加密算法,它使用异或(XOR)操作来对明文和密钥进行加密和解密,本文为大家介绍了C#实现XOR密码的相关知识,希望对大家有所帮助
    2024-01-01
  • c#在WebAPI使用Session的方法

    c#在WebAPI使用Session的方法

    这篇文章主要介绍了c#在WebAPI使用Session的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • C#调用存储过程详解(带返回值、参数输入输出等)

    C#调用存储过程详解(带返回值、参数输入输出等)

    这篇文章主要介绍了C#调用存储过程的方法,结合实例形式详细分析了各种常用的存储过程调用方法,包括带返回值、参数输入输出等,需要的朋友可以参考下
    2016-06-06
  • C#中实现Json序列化与反序列化的几种方式

    C#中实现Json序列化与反序列化的几种方式

    C#中实现Json的序列化与反序列化也算是个老话题,那么在这篇文章中我们将老话重提,本文中将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。有需要的朋友们可以参考借鉴,下面来跟着小编一起学习学习吧。
    2016-12-12
  • C#实现自定义Dictionary类实例

    C#实现自定义Dictionary类实例

    这篇文章主要介绍了C#实现自定义Dictionary类,较为详细的分析了Dictionary类的功能、定义及用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • c#中Winform实现多线程异步更新UI(进度及状态信息)

    c#中Winform实现多线程异步更新UI(进度及状态信息)

    本篇文章主要介绍了c#中Winform实现多线程异步更新UI(进度及状态信息) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C#中GraphicsPath的Widen方法用法实例

    C#中GraphicsPath的Widen方法用法实例

    这篇文章主要介绍了C#中GraphicsPath的Widen方法用法,实例分析了Widen方法的使用技巧,需要的朋友可以参考下
    2015-06-06
  • C#之Socket客户端全过程

    C#之Socket客户端全过程

    这篇文章主要介绍了C#之Socket客户端全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • C#实现简易点餐功能

    C#实现简易点餐功能

    这篇文章主要为大家详细介绍了C#实现简易点餐功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C# Linq读取XML文件的实例

    C# Linq读取XML文件的实例

    C# Linq读取XML文件的实例,需要的朋友可以参考一下
    2013-05-05

最新评论