• C#学习(六)- LINQ


      LINQ是.NET Framework 3.5的新特性,其全称是 Language Integrated Query,即语言集成查询,是指将查询功能和语言结合起来。从而为我们提供一种统一的方式,让我们能在C#或VB.NET语言中直接查询和操作各种数据。

      借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。通过使用LINQ,我们能够在C#编程语言内直接创建被称为“查询表达式(query expression)”的实体。这些查询表达式是基于许多查询运算符(query operator)的,而且是有意设计成类似SQL表达式的。并且,查询表达式可以用来与多种数据进行交互,以一种统一的方式来操作各种数据。

    1. 一个小例子 - 简单的开始

      LINQ中最基本的数据单元是sequences和elements。一个sequence是实现了IEnumerable<T>的对象,而一个element是sequence中的每一个元素。如下,names就是一个sequence,”Tom”,“Dick”和”Harry”则是elements。

    1 string[] names = { "Tom", "Dick", "Harry" };

      一个查询运算符就是用来转换sequence的方法。一个典型的查询运算符接收一个输入sequence并输出一个转换之后的sequence。在System.Linq.Enumerable类中,总共定义了40来个查询运算符——全部用扩展方法来实现,他们被称为标准查询运算符。

      一个查询则是由查询运算符来转换sequence的一个表达式,最简单的查询由一个input sequence和一个查询运算符组成。比如:

     1 static void Main(string[] args)
     2 {
     3     string[] names = { "Tom", "Dick", "Harry"   };
     4 
     5     // 获取所有长度大于等于4的名字
     6     IEnumerable<string> filteredNames = System.Linq.Enumerable.Where(
     7                                    names, n => n.Length >= 4);
     8     foreach (string n in filteredNames)
     9              Console.WriteLine(n);
    10 }

       运行结果:

       大部分查询运算符都接受一个lambda表达式作为参数,lambda表达式决定了查询的行为特性和结果。在上例中,lambda表达式为:

    n => n.Length   >= 4

      Lambda表达式格式为:(parameters) => expression-or-statement-block

      在这里的lambda表达式中,输入参数n对应了names数组的每一个元素,其类型为string。Where运算符要求lambda表达式返回一个bool值,当结果为true时,表示该元素会包含在输出sequence中。

      另一个小例子:下面的query获取所有包含字母D的名字:

    static void Main(string[] args)
    {
        string[] names = { "Tom", "Dick", "Harry" };
                
        IEnumerable<string> filteredNames = names.Where(n => n.Contains("D"));
    
        foreach (string name in filteredNames)
                    Console.WriteLine(name);
    }

      运行结果:

      到现在为止,我们通过使用扩展方法和lambda表达式来建立了LINQ query。我们很快就能看到,这种策略非常的灵活和适合query的创建,因为我们可以级联的使用查询运算符。通常,这种方法被称为LINQ方法语法(英文著作中称为fluent syntax)。C#还提供了另外一种书写query的语法,叫做查询表达式语法(英文著作中称为query expression syntax),下面是一个用查询表达式语法建立的query,让我们先睹为快:

    static void Main(string[] args)
            {
                string[] names = { "Tom", "Dick", "Harry" };
                
                IEnumerable<string> a = from n in names
                                        where n.Contains("a")
                                        select n;    // 这就与SQL语句十分相似了,操作数据库将十分顺手
                                                     // 习惯使用SQL语句的使用者也感到便利。
                foreach (string ab in a)
                    Console.WriteLine(ab);
            }

      运行结果:

  • 相关阅读:
    【BZOJ】4636: 蒟蒻的数列
    BZOJ1878 [SDOI2009]HH的项链
    【网络流24题----02】太空飞行计划
    【网络流24题----03】Air Raid最小路径覆盖
    【网络流24题----01】飞行员配对方案问题
    素数判定(米勒测试定理-费马小定理+快速乘)
    一堆模板(丑陋0.0)------数据结构
    丑数(USACO)
    NOI[2001]食物链
    关于Tarjan(2)
  • 原文地址:https://www.cnblogs.com/yongheng20/p/4457887.html
Copyright © 2020-2023  润新知