zoukankan      html  css  js  c++  java
  • C#4.0图解教程 第21章 介绍LINQ

    21.1 什么是LINQ

     1 static void Main(string[] args)
     2  {
     3 int[] numbers = { 2, 12, 5, 15 };
     4 IEnumerable<int> lowNums = from n in numbers
     5 where n < 10
     6 select n;
     7 foreach (var lowNum in lowNums)
     8  {
     9 Console.Write("{0}, ",lowNum);
    10  }
    11 }

    结果:2,5,

    21.2 LINQ提供程序

    匿名类型

    创建对象表达式时初始化新类实例的字段和属性,这种形式的创建表达式由三部分组成:new关键字、类名或构造函数以及对象初始化器。对象初始化器在一组大括号内包含了逗号分隔的成员初始化列表。

    创建匿名类型的变量使用相同形式,但没有类名和构造方法。

    image

    匿名类型实例:

     static void Main(string[] args)
    {
    var student = new
    {
    LName = "Jones",
    FName = "Mary",
    Age = 19,
    Major = "History"
    };
    Console.WriteLine(
    "{0}{1},Age {2},Major:{3}",
    student.FName,
    student.LName,
    student.Age,
    student.Major
    );
    }

    image

    21.3 查询语法和方法语法

    查询语法:是声明形式,像SQL。

    方法语法:是命令形式,使用标准方法调用,方法是一组叫做标准查询运算符的方法。

     static void Main(string[] args)
    {
    int[] numbers = { 2, 5, 28, 31, 17, 16, 42 };
    var numsQuery = from n in numbers //查询语法
    where n < 20
    select n;
    var numsMethod = numbers.Where(x => x < 20); //方法语法 
    int numsCount = (from n in numbers //两种形式组合
    where n < 20
    select n).Count();
    foreach (var i in numsQuery)
    {
    Console.Write("{0},", i);
    }
    Console.WriteLine();
    foreach (var i in numsMethod)
    {
    Console.Write("{0},", i);
    }
    Console.WriteLine();
    Console.WriteLine(numsCount);
    }

    image

    21.4 查询变量

    LINQ返回两种类型的结果——

    一个枚举(可枚举的一组数据,不是枚举类型),它列出了满足查询参数的的项列表;

    一个叫做标量(scalar)的单一值(某种摘要形式)。

     1 static void Main(string[] args)
     2  {
     3 int[] arr1 = { 2, 5, 28 };
     4 IEnumerable<int> lowNums = from i in arr1 //返回枚举数
     5 where i < 20
     6 select i;
     7 var numsCount = (from n in arr1
     8 where n < 20
     9 select n).Count(); //返回一个整数
    10 foreach (var lowNum in lowNums)
    11  {
    12  Console.Write(lowNum);
    13  }
    14  Console.WriteLine();
    15  Console.WriteLine(numsCount);
    16 //结果:
    17 //25
    18 //2
    19 }

    21.5 查询表达式的结构

    image

    21.5.1 from 子句

    from Type Item in Item

    image

    21.5.2 join 子句

    join Identifier inColiiection2 on Field1 equals Filed2

    image

    示例:

    image

    21.5.3 什么是联结

     1 class Program
     2  {
     3 public class Student
     4  {
     5 // Declare classes.
     6 public int StID;
     7 public string LastName;
     8  }
     9
    10 public class CourseStudent
    11  {
    12 public string CourseName;
    13 public int StID;
    14  }
    15
    16 // Initialize arrays. 初始化数组
    17 private static CourseStudent[] studentsInCourses = new CourseStudent[]
    18  {
    19 new CourseStudent {CourseName = "Art", StID = 1},
    20 new CourseStudent {CourseName = "Art", StID = 2},
    21 new CourseStudent {CourseName = "History", StID = 1},
    22 new CourseStudent {CourseName = "History", StID = 3},
    23 new CourseStudent {CourseName = "Physics", StID = 3},
    24  };
    25
    26 private static Student[] students = new Student[]
    27  {
    28 new Student {StID = 1, LastName = "Carson"},
    29 new Student {StID = 2, LastName = "Klassen"},
    30 new Student {StID = 3, LastName = "Fleming"},
    31  };
    32
    33 private static void Main()
    34  {
    35 // Find the last names of the students taking history.
    36 var query = from s in students
    37 join c in studentsInCourses on s.StID equals c.StID
    38 where c.CourseName == "History"
    39 select s.LastName;
    40 // Display the names of the students taking history.
    41 foreach (var q in query)
    42 Console.WriteLine("Student taking History: {0}", q);
    43  }
    44 }

    结果:

    Student taking History:  Carson
    Student taking History:  Fleming
    请按任意键继续. . .

    21.5.4 查询主体中的 from...let...where 片段

    1.from

     static void Main()
    {
    var groupA = new[] { 3, 4, 5, 6 };
    var groupB = new[] { 6, 7, 8, 9 };
    var someInts = from a in groupA
    from b in groupB
    where a > 4 && b <= 8
    select new { a, b, sum = a + b };
    foreach (var a in someInts)
    Console.WriteLine(a);
    }

     

    image

    2.let子句

    let子句接受一个表达式的运算并且把它赋值给一个需要在其他运算中使用的标识符。

    let Identifier(标识符) = Expression(表达式)

     1 static void Main()
     2  {
     3 var groupA = new[] { 3, 4, 5, 6 };
     4 var groupB = new[] { 6, 7, 8, 9 };
     5 var someInts = from a in groupA
     6 from b in groupB
     7 let sum = a + b //新的变量中保存结果
     8 where sum == 12
     9 select new { a, b, sum };
    10 foreach (var a in someInts)
    11  Console.WriteLine(a);
    12 }

    3.where子句

    where BooleamExpression

    1.只要在from..let..where部分始终,表达式可以存在多个where子句。

    2.一个项目必须满足 where 子句才能避免在之后被过滤。

     static void Main()
    {
    var groupA = new[] { 3, 4, 5, 6 };
    var groupB = new[] { 6, 7, 8, 9 };
    var someInts = from int a in groupA
    from int b in groupB
    let sum = a + b
    where sum >= 11
    where a == 4
    select new { a, b, sum };
    foreach (var a in someInts)
    Console.WriteLine(a);
    }

    21.5.5 orderby 子句

    1.orderby默认为升序。我们可以设置ascending和descending选择升序或降序。

    2.可以有任意多个子句,他们必须使用逗号分隔。

     1 static void Main()
     2  {
     3 var students = new[] // Array of objects of an anonymous type
     4  {
     5 new {LName = "Jones", FName = "Mary", Age = 19, Major = "History"},
     6 new {LName = "Smith", FName = "Bob", Age = 20, Major = "CompSci"},
     7 new {LName = "Fleming", FName = "Carol", Age = 21, Major = "History"}
     8  };
     9 var query = from student in students
    10 orderby student.Age descending
    11 select student;
    12 foreach (var s in query)
    13  {
    14 Console.WriteLine("{0}, {1}: {2} - {3}",
    15  s.LName, s.FName, s.Age, s.Major);
    16  }
    17 }

    Fleming, Carol:  21 - History
    Bob:  20 - CompSci 
    Jones, Mary:  19 - History 
    请按任意键继续. . .

  • 相关阅读:
    红黑树以及与AVL树的区别
    yum安装mysql
    sql注入攻击
    http keep-alive
    csrf和xss
    点击事件跳转QQ 添加好友
    引入百度地图及出现的问题
    node 出现npm ERR! code ERR_TLS_CERT_ALTNAME_INVALID npm ERR! errno ERR_TLS_CERT_ALTNAME_INVALID npm ERR! request to https://registry.cnpmjs.org/vue-cli failed, reason:
    正则表达式校验-大于0的所有数,小数点后保留两位小数和正整数
    vue项目引入富文本编辑器(回显)
  • 原文地址:https://www.cnblogs.com/tangge/p/2888794.html
Copyright © 2011-2022 走看看