/*
以下围绕Person类实现,Person类只有Name和Age两个属性
一.List<T>排序
1.1 List<T>提供了很多排序方法,sort(),Orderby(),OrderByDescending().
*/ lstPerson = lstPerson.OrderByDescending(x=>x.Name).ToList(); //降序
lstPerson = lstPerson.OrderBy(x => x.Age).ToList();//升序 //通过Name和Age升序
lstPerson.Sort((x, y) =>
{
if ((x.Name.CompareTo(y.Name) > 0) || ((x.Name == y.Name) && x.Age > y.Age))
{
return 1;
}
else if ((x.Name == y.Name) && (x.Age == y.Age))
{
return 0;
}
else
{
return -1;
}
}); /*
1.2 因为最近有做datagrid里面像实现点击任何一列的名称就按照该名称排序,那我们该怎么做呢?可能第一反应是想,为每一个属性写一个排序方法不就得了,其实这样的话无意间增加的代码量了,而且不通用,其实这里可以结合反射来实现.
*/ string propertityName = "Name";
lstPerson = lstPerson.OrderBy(x =>
{
PropertyInfo[] proInfos = x.GetType().GetProperties();
return proInfos.Where(info => info.Name == propertityName).ToList()[0].GetValue(x);
}).ToList(); /*
二.List<T>分页
2.1往往有时候我们会从后台获取很多数据,存放在List<T>,可是因为界面受限制无法完全展示,我们就会想到分页显示,对于分页显示我们基本上第一种想法肯定是通过循环设置每一页的Size,
其实linq有skip和take方法,skip表示跳过多少元素,take获取特定个数元素. 看起来代码简洁多了.
*/ public static List<Person> GetPageByLinq(List<Person> lstPerson, int pageIndex, int PageSize)
{
return lstPerson.Skip((pageIndex - 1) * PageSize).Take(PageSize).ToList();
} /*
三,List<T>之foreach用法.
2.1 如何我相对List里面的每个对象执行相同操作的话,以前都是通过for循环遍历,其实Linq提供了便捷的Foreach来实现。下面我将对所有的Person年龄+2.
*/ lstPerson.ForEach(x => x.Age= x.Age + 2); /*两个集合之间操作*/
List<string> ListResult = new List<string>();
ListResult = ListA.Distinct().ToList();//去重
ListResult = ListA.Except(ListB).ToList();//差集
ListResult = ListA.Union(ListB).ToList(); //并集
ListResult = ListA.Intersect(ListB).ToList();//交集 //这里有7个老师,每个人有3个学生,总共21一个学生里,我们想要获得这3个未及格的学生集合。
public class Student
{
public string StudentName { get; set; }
public int Score { get; set; } public Student(string StudentName,int Score)
{
this.StudentName = StudentName;
this.Score = Score;
}
}
public class Teacher
{
public string TeacherName { get; set; }
public List<Student> Students { get; set; }
public Teacher(string TeacherName, List<Student> Students)
{
this.TeacherName = TeacherName;
this.Students = Students;
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace TestLinq
{
class Program
{
static void Main(string[] args)
{
//运行结果见下图
List<Teacher> teachers = new List<Teacher>
{
new Teacher("张老师",new List<Student>{ new Student("张三1", 100),new Student("李四1", 90),new Student("王五1", 30) }), //
new Teacher("李老师",new List<Student>{ new Student("张三2", 100),new Student("李四2", 90),new Student("王五2", 60) }),
new Teacher("赵老师",new List<Student>{ new Student("张三3", 100),new Student("李四3", 90),new Student("王五3", 40) }), //
new Teacher("孙老师",new List<Student>{ new Student("张三4", 100),new Student("李四4", 90),new Student("王五4", 60) }),
new Teacher("钱老师",new List<Student>{ new Student("张三5", 100),new Student("李四5", 90),new Student("王五5", 50) }), //
new Teacher("周老师",new List<Student>{ new Student("张三6", 100),new Student("李四6", 90),new Student("王五6", 60) }),
new Teacher("吴老师",new List<Student>{ new Student("张三7", 100),new Student("李四7", 90),new Student("王五7", 60) })
}; #region 所有任课老师下未及格的学生 方式一
List<Student> studentList = new List<Student>();
foreach (var t in teachers)
{
foreach (var s in t.Students)
{
if (s.Score < 60)
{
studentList.Add(s);
}
}
}
studentList.ForEach(s => Console.WriteLine(string.Format("{0} - {1}", s.StudentName, s.Score)));
#endregion Console.ReadKey(); #region 所有任课老师下未及格的学生 方式二
var list1 = from t in teachers
from s in t.Students
where s.Score < 60
select s;
foreach (var item in list1)
{
Console.WriteLine(string.Format("{0} - {1}", item.StudentName, item.Score));
}
#endregion Console.ReadKey(); #region 所有任课老师下未及格的学生 方式三
var list2 = teachers.SelectMany(t => t.Students).Where(s => s.Score < 60); foreach (var s in list2)
{
Console.WriteLine(string.Format("{0} - {1}", s.StudentName, s.Score));
}
#endregion Console.ReadKey(); #region 所有未及格的学生及其授课老师
var list3 = teachers.SelectMany(
t => t.Students,
(t, s) => new { t.TeacherName, s.StudentName, s.Score })
.Where(n => n.Score < 60); foreach (var item in list3)
{
Console.WriteLine(string.Format("任课老师{0} - 学生{1} 分数{2}", item.TeacherName, item.StudentName, item.Score));
}
#endregion
Console.ReadKey();
}
}
}

Linq常用List操作总结,ForEach、分页、交并集、去重、SelectMany等的更多相关文章

  1. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  2. LINQ系列:LINQ to XML操作

    LINQ to XML操作XML文件的方法,如创建XML文件.添加新的元素到XML文件中.修改XML文件中的元素.删除XML文件中的元素等. 1. 创建XML文件 string xmlFilePath ...

  3. 如何正确看待Linq的DistinctBy扩展和ForEach扩展

    在微软标准的Linq中,并没有DistinctBy扩展和ForEach扩展,但在平时使用工作中却又经常需要使用到这两个功能,照理来说,微软在Linq中应该包含这两个扩展才对,可事实上为什么并没有呢?本 ...

  4. NodeJs操作MongoDB之分页功能与常见问题

    NodeJs操作MongoDB之分页功能与常见问题 一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 db.User.count(<query>) ...

  5. ES6常用对象操作

    ES6常用对象操作 一. const 简单类型数据常量 // const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动.对于简单类型的数据(数值.字符串.布尔值),值就保存在 ...

  6. Linq特取操作之ElementAt,Single,Last,First源码分析

    Linq特取操作之ElementAt,Single,Last,First源码分析 一:linq的特取操作 First/FirstOrDefault, Last/LastOrDefault, Eleme ...

  7. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  8. SNMP常用数据操作

    SNMP常用数据操作 snmp编程中常见的数据类型基本上就是integer32/oct_str(字节数组)/counter64/timeticks/dateAndTime这些.很多其它的比如Truth ...

  9. 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念

    本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...

随机推荐

  1. if判断与比较操作符gt、lt、eq等的使用

    在整数中比较使用如下  //-eq 等于(equal) if [ "$a" -eq "$b" ] //-ne不等于(no equal) if [ "$ ...

  2. 只查看tomcat进程,不包括grep

    ps aux | grep tomcat  | grep -v "grep" | awk '{print $2}'

  3. servlet 返回json 数据

    后端的数据需要返回简单的json数据: 发现通过双引号和单引号:" {  'name':123 }  "的方式返回失败. 需要通过\转义里边的双引号: response.getWr ...

  4. css浮动Float

    核心:浮动元素会脱离文档流并向左/向右移动,直到碰到父元素或者另外一个浮动元素. float :left 向左浮动 right 向右浮动 none (默认)     inherit  继承父元素 fl ...

  5. 入门-什么是webshell?

    webshell是什么? 顾名思义,"web" - 显然需要服务器开放web服务,"shell" - 取得对服务器某种程度上操作权限. webshell常常被称 ...

  6. make: Nothing to be done for 'all' 解决方法

    make: Nothing to be done for 'all' 解决方法 1.这句提示是说明你已经编译好了,而且没有对代码进行任何改动. 若想重新编译,可以先删除以前编译产生的目标文件:make ...

  7. 201521123022 《Java程序设计》 第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...

  8. 201521123049 《JAVA程序设计》 第1周学习总结

    1. 本章学习总结 1.认识了新的一门计算机编程语言JAVA: 2.JAVA的编写与C语言类似,都是不能利用指针进行编写: 3.在实验课上初步认识JAVA并利用JAVA进行简单的编程,在实践上得到进一 ...

  9. 201521123106 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  10. JS严格模式

    如何开启严格模式? 在js中,只需要在顶部添加"use strict",即可进入严格模式 在函数中加上"use strict"编辑指示,也可以指定函数在严格模式 ...