Linq(筛选与排序)

Linq(筛选与排序)

以下内容转载自:http://www.cnblogs.com/xfrog/archive/2010/09/11/1824086.html

本文将讲述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. }
      

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

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

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

  • 隐藏行号 复制代码 ? C#
    1. var query = from student in students
      
    2.             where student.Class == "一班" && student.Name.StartsWith("张")
      
    3.             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. foreach (var s in query)
      
    5. {
      
    6.     Console.WriteLine(s);
      
    7. }
      

    注意上例中使用了嵌套查询,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. namespace LinqStudy
    
  6. {
    
  7.     public static class DataCreator
    
  8.     {
    
  9.         public static void GenerateData(List<Student> students,List<Courses> courses)
    
  10.         {
    
  11.             students.Add(new Student("001","张三", "一班"));
    
  12.             students.Add(new Student("002", "李四", "一班"));
    
  13.             students.Add(new Student("003", "王五", "二班"));
    
  14.             courses.Add(new Courses("001", "数学", 20));
    
  15.             courses.Add(new Courses("001", "语文", 20));
    
  16.             courses.Add(new Courses("001", "物理", 15));
    
  17.             courses.Add(new Courses("002", "历史", 20));
    
  18.             courses.Add(new Courses("002", "政治", 20));
    
  19.             courses.Add(new Courses("002", "语文", 30));
    
  20.             courses.Add(new Courses("003", "经济学", 20));
    
  21.             courses.Add(new Courses("003", "企业管理", 20));
    
  22.             courses.Add(new Courses("003", "财务管理", 30));
    
  23.         }
    
  24.     }
    
  25.     public class Student
    
  26.     {
    
  27.         public String Name { get; set; }
    
  28.         public String Class { get; set; }
    
  29.         public String ID { get; set; }
    
  30.         public Student(String id,String name, String c)
    
  31.         {
    
  32.             ID = id;
    
  33.             Name = name;
    
  34.             Class = c;
    
  35.         }
    
  36.         public override string ToString()
    
  37.         {
    
  38.             return String.Format("学号:{0}\t姓名:{1}\t班级:{2}", this.ID, this.Name, this.Class);
    
  39.         }
    
  40.     }
    
  41.     public class Courses
    
  42.     {
    
  43.         public String Name { get; set; }
    
  44.         public int Credit { get; set; }
    
  45.         public String StudentId { get; set; }
    
  46.         public Courses(String id,String name, int credit)
    
  47.         {
    
  48.             StudentId = id;
    
  49.             Name = name;
    
  50.             Credit = credit;
    
  51.         }
    
  52.         public override string ToString()
    
  53.         {
    
  54.             return String.Format("课程名称:{0}\t学时:{1}", this.Name, this.Credit);
    
  55.         }
    
  56.     }
    
  57. }
    
时间: 2024-10-05 11:17:26

Linq(筛选与排序)的相关文章

linq 对象属性排序

WSWSVoucher [] wswsv = new WSWSVoucher[4]; wswsv= wswsv.OrderBy(s => s.creditAmount).ToArray<WSWSVoucher>(); wswsv= wswsv.OrderByDescending(s => s.creditAmount).ToArray<WSWSVoucher>(); linq 对象属性排序,布布扣,bubuko.com

数据库中复杂的联查+筛选条件+排序+分页

数据库中复杂的联查+筛选条件+排序+分页一直是比较头疼的问题 为了模拟这个问题,首先建立两个表 create table t_userType ( id int identity(1,1) not null primary key, name varchar(50) ) GO create table t_user ( id int identity(1,1) not null primary key, t_userTypeId int not null, name varchar(50), f

LINQ之路14:LINQ Operators之排序和分组(Ordering and Grouping)

本篇继续LINQ Operators的介绍,这里要讨论的是LINQ中的排序和分组功能.LINQ的排序操作符有:OrderBy, OrderByDescending, ThenBy, 和ThenByDescending,他们返回input sequence的排序版本.分组操作符GroupBy把一个平展的输入sequence进行分组存放到输出sequence中. 排序/Ordering IEnumerable<TSource>→IOrderedEnumerable<TSource> O

c#数据筛选和排序

一.TreeView SelectedNode    选中的节点            Level    节点的深度(从0开始)                AfterSelect    节点选中后发生 1.获取节点深度 this.tvlist.SelectNode.Level 2.获取节点名称 this.tvlist.SelectNode.Text 二.使用DataView筛选和排序数据 RowFilter指定筛选条件            Sort指定排序方式 //窗体运行时默认选中全部 

数据筛选和排序------的解析

一.TreeView SelectedNode 选中的节点 Level 节点的深度(从0开始) AfterSelect 节点选中后发生 1.获取节点深度 this.tvlist.SelectNode.Level 2.获取节点名称 this.tvlist.SelectNode.Text 二.使用DataView筛选和排序数据 RowFilter指定筛选条件 Sort指定排序方式 //窗体运行时默认选中全部 if (this.tvstulist.SelectedNode.Level == 0) {

产品列表页分类筛选、排序的算法实现(PHP)

一.简单的单条件查询 工作都是从简单的开始,先从最简单的单表查询开始,这个一般用在首页以及一些比较独立的页面,只需要查找几个符合条件的产品展示出来即可,可以使用分页或者不使用分页.下面这个是产品控制器 ProductController 中的一个函数,用于简单的查询,比如199元专区就可以使用 getTypeSimPro('price=199'); /**简单的筛选条件分类产品,单表查询 * @param string $sql 单表查询的SQL * @param int $countPerPa

Linq 动态查询排序

Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip(0).Take(10); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query.OrderBy(x=>x.GetType().GetField("Tel")).Skip(0).Take(10); 上面的写法是无法编译通过的,此路不通,于是找到一个order扩展类: 1 using System; 2 using System.Linq; 3 using

LINQ系列:排序操作符

LINQ排序操作符包括:OrderBy.OrderByDescending.ThenBy.ThenByDescending及Reverse. 1. OrderBy 1>. 原型定义 public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> ke

WPF筛选、排序和分组

可以通过CollectionViewSource或者CollectionView对视图进行排序.筛选和分组. 一.通过CollectionViewSource listingDataView是CollectionViewSource的一个实例. 1.排序 listingDataView.SortDescriptions.Add( new SortDescription("Category", ListSortDirection.Ascending)); istingDataView.S