Linq(筛选与排序)

转载 2012年03月23日 10:35:42

本文将讲述LINQ的基础查询(此文所有例子都使用LINQ to Object)

在此之前,我们先创建一个用于示例的数据源:

  •  
    •     Student类:表示学生,包括学号、姓名及班级
  •     Courses类:表示学生选择的课程,包括学号、课程名称及学时数
  •     DataCreator类:静态类,通过GenerateData方法产生示例数据
  • 生成的数据如下:

    学号    姓名    班级    课程名称    学时 
    003        王五    二班    经济学    20 
    003        王五    二班    企业管理    20 
    003        王五    二班    财务管理    30 
    002        李四    一班    历史    20 
    002        李四    一班    政治    20 
    002        李四    一班    语文    30 
    001        张三    一班    数学    20 
    001        张三    一班    语文    20 
    001        张三    一班    物理    15

    Main方法中生成数据:

    隐藏行号 复制代码 C#
    1. List<Student> students = new List<Student>();
    2. List<Courses> courses = new List<Courses>();
    3. DataCreator.GenerateData(students, courses);

     

    筛选

        LINQ中通过where子句筛选数据,where子句后跟条件,from后的对象都可作为where子句判断条件的主体。

  •     实际上from .. in ..语句类似于foreach语句,比如

  •         from student in students 类似于 foreach(Student student in students)

  •     student是students集合中的元素,那么通常在where语句中,可以使用student作为判断的依据,例如:

  •     筛选出一班的所有学生:

  • 隐藏行号 复制代码 C#
    1. var query = from student in students
      
    2.             where student.Class == "一班"
      
    3.             select student;
      
    4. foreach (var s in query)
      
    5. {
      
    6.     Console.WriteLine(s);
      
    7. }
      
    8. 
      

        筛选学时大于等于20的课程:

  • 隐藏行号 复制代码 C#
    1. var query = from course in courses
      
    2.             where course.Credit >= 20
      
    3.             select course;
      

         可使用&&或||来连接多个条件,如筛选出一班姓张的同学:

  • 隐藏行号 复制代码 C#
    1. 
      
    2. var query = from student in students
      
    3.             where student.Class == "一班" && student.Name.StartsWith("张")
      
    4.             select student;
      

         当然,并不是说条件语句中只能使用from后的对象,它可以使用任何对象作为判断依据(下面LINQ只作演示没实际意义):条件当前时间等于当前时间,此条件永远为真,故会查询出所有的学生资料。

  • 隐藏行号 复制代码 C#
    1. var query = from student in students
      
    2.             where DateTime.Now == DateTime.Now
      
    3.             select student;
      
  •     下例以students集合的数量作为判断条件,当stuents的数量大于等于3时筛选出所有学生资料:
  • 隐藏行号 复制代码 C#
    1. var query = from student in students
      
    2.             where students.Count>=3
      
    3.             select student;
      

         下例筛选学号存在于ids集合中的学生:

  • 隐藏行号 复制代码 C#
    1. String[] ids = {"001","003" };
      
    2. var query = from student in students
      
    3.             where ids.Contains(student.ID)
      
    4.             select student;
      

         查询选修了语文课程的学生资料:

  • 隐藏行号 复制代码 C#
    1. var query = from student in students
      
    2.             where (from cours in courses where cours.Name == "语文" select cours.StudentId).Contains(student.ID)
      
    3.             select student;
      
    4. 
      
    5. foreach (var s in query)
      
    6. {
      
    7.     Console.WriteLine(s);
      
    8. }
      

         注意上例中使用了嵌套查询,students where语句中包含另一个LINQ语句,该语句从courses集合中返回选修了语文课程的学号,它是一个IEnumerable<String>集合,所以可以在此集合上使用IEnumerable的Contains方法,判断集合中是否包含当前student对象的ID,包含则返回true,即students的where语句为真,该student对象被添加入结果集合,反之不添加。

  •  

    排序

     

    排序语句比较简单,基本语法为:

        orderby .. ascending | descending[, ..ascending | descending]

    其中ascending表示升序排列,descending表示降序排列

隐藏行号 复制代码 C#
  1. var query = from student in students
    
  2.             orderby student.ID ascending /*descending*/
    
  3.             select student;
    

    可根据多个字段进行排序:

隐藏行号 复制代码 C#
  1. var query = from student in students
    
  2.             orderby student.ID ascending,student.Name descending
    
  3.             select student;
    

待续…

    以下源码产生本文示例数据:

隐藏行号 复制代码 C#
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Linq;
    
  4. using System.Text;
    
  5. 
    
  6. namespace LinqStudy
    
  7. {
    
  8.     public static class DataCreator
    
  9.     {
    
  10.         public static void GenerateData(List<Student> students,List<Courses> courses)
    
  11.         {
    
  12.             students.Add(new Student("001","张三", "一班"));
    
  13.             students.Add(new Student("002", "李四", "一班"));
    
  14.             students.Add(new Student("003", "王五", "二班"));
    
  15. 
    
  16. 
    
  17.             courses.Add(new Courses("001", "数学", 20));
    
  18.             courses.Add(new Courses("001", "语文", 20));
    
  19.             courses.Add(new Courses("001", "物理", 15));
    
  20. 
    
  21.             courses.Add(new Courses("002", "历史", 20));
    
  22.             courses.Add(new Courses("002", "政治", 20));
    
  23.             courses.Add(new Courses("002", "语文", 30));
    
  24. 
    
  25.             courses.Add(new Courses("003", "经济学", 20));
    
  26.             courses.Add(new Courses("003", "企业管理", 20));
    
  27.             courses.Add(new Courses("003", "财务管理", 30));
    
  28.         }
    
  29.     }
    
  30. 
    
  31.     public class Student
    
  32.     {
    
  33.         public String Name { get; set; }
    
  34.         public String Class { get; set; }
    
  35.         public String ID { get; set; }
    
  36. 
    
  37.         public Student(String id,String name, String c)
    
  38.         {
    
  39.             ID = id;
    
  40.             Name = name;
    
  41.             Class = c;
    
  42.         }
    
  43. 
    
  44.         public override string ToString()
    
  45.         {
    
  46.             return String.Format("学号:{0}\t姓名:{1}\t班级:{2}", this.ID, this.Name, this.Class);
    
  47.         }
    
  48.     }
    
  49. 
    
  50.     public class Courses
    
  51.     {
    
  52.         public String Name { get; set; }
    
  53.         public int Credit { get; set; }
    
  54.         public String StudentId { get; set; }
    
  55. 
    
  56.         public Courses(String id,String name, int credit)
    
  57.         {
    
  58.             StudentId = id;
    
  59.             Name = name;
    
  60.             Credit = credit;
    
  61.         }
    
  62. 
    
  63.         public override string ToString()
    
  64.         {
    
  65.             return String.Format("课程名称:{0}\t学时:{1}", this.Name, this.Credit);
    
  66.         }
    
  67.     }
    
  68. }
    
  69. 
    

Lambda表达式和Linq实现数据集的简单筛选并排序

1、Lambda表达式             List array = new List() { 20, 21, 22, 10, 12, 13, 14, 5, 6, 7, 8, 9 };    ...
  • zsran022610
  • zsran022610
  • 2015年01月19日 16:09
  • 2001

C# 中使用Linq和Lambda表达式对List<T>进行排序

C#中List排序的两种方法 List stu = (ListStudent>)Session["StudentList"]; Linq表达式: //按学号降序 Lis...
  • fysuccess
  • fysuccess
  • 2014年07月02日 14:07
  • 10168

List<String>Linq筛选数据

linq用法如下: List list = new List(); var q = from String s in list ...
  • qq395537505
  • qq395537505
  • 2016年06月20日 13:26
  • 3935

datatable筛选、查询-------linq

for (int i = 0; i < dt.Rows.Count; i++) { var qu = from tb in dt...
  • xipan10102232
  • xipan10102232
  • 2015年09月15日 18:22
  • 2498

C# Linq处理 Where条件筛选

C# Linq处理 Where条件筛选
  • u012698249
  • u012698249
  • 2017年12月28日 13:19
  • 93

LINQ 按多个字段排序

LINQ 按多个字段排序(orderby、thenby、Take)   orderby  子句解析为 OrderBy()方法,orderby descending 子句解析为OrderBy...
  • QingHeShiJiYuan
  • QingHeShiJiYuan
  • 2016年07月15日 07:54
  • 2779

LINQ排序,用order by 子句进行排序

在LINQ中,orderby子句可以同时指定多个排序元素,还可以为每个排序元素指定独立的排序方式。orderby语句后的第一个的排序元素为主要排序,第二个位次要排序,依次类推,如下所示,将所有学生首先...
  • wfy230625
  • wfy230625
  • 2015年12月28日 19:25
  • 1362

C# 使用LINQ、泛型、Index函数优化switch(或者多条if)语句

背景:         判断某个变量是不是".txt.doc.xls.ppt.pdf"中的某一种格式,如果是则执行相应的操作。 方法一:使用泛型 readonly IList fNames = ne...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年03月07日 10:08
  • 1663

LINQ 的查询_联表、分组、排序

1:查询 //根据科目分组查询 //var v = from s in db.Set().ToList() // group s by ...
  • Moon_LL
  • Moon_LL
  • 2016年08月22日 11:31
  • 596

LINQ 根据指定属性名称对序列进行排序

///         /// 根据指定属性名称对序列进行排序         ///         /// source中的元素的类型         /// 一个要排序的值序列  ...
  • yousuf007
  • yousuf007
  • 2015年01月08日 13:49
  • 703
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linq(筛选与排序)
举报原因:
原因补充:

(最多只允许输入30个字)