文档章节

Linq常用List操作总结,ForEach、分页、交并集、去重、SelectMany等

深圳大道
 深圳大道
发布于 2016/12/29 15:39
字数 950
阅读 5
收藏 0
/*
以下围绕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();
        }
    }
}

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/52883285

深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
linq学习圣经

linq是Language Integrated Query(LINQ,语言集成查询)属于net平台。通过LINQ,我们可以使用相同API操作不同的数据源。linq项目,包括linq威客系统交易系统开发,学生管理系统等。 。linq使...

crossmix
2015/11/25
58
0
101个LINQ例子

101 LINQ Samples 说明:本文摘抄自Microsoft的MSDN网站,因为原文不方便快速阅读和学习,故此调整如下。本文所有权利归Microsoft公司所有。如果您觉得本文侵犯了您的著作权,请来信告知,我...

长平狐
2012/10/23
241
0
MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))

目录 一、前言 (一) 运行环境 二、前期准备工作 (一) 创建 MongoDBContext MongoDb操作上下文类 (二)创建测试类 (三) 创建测试代码 三、内嵌数组增加元素操作 (一) Update.Set()方法 ...

InCerry
2018/07/30
0
0
LINQ标准查询操作符

1.投影操作符:将序列中的元素转换为一个由开发人员定义的形式的操作。 Select :对单个序列或集合中的值进行投影。 string[] Devices = { "电视", "电冰箱", "洗衣机", "电话", "微波炉" }......

技术小甜
2017/11/16
0
0
LINQ查询操作符 LINQ学习第二篇

一、投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影。下面的示例中使用select从序列中返回Employee表的所有列: 当然,你也可以返回单个列,例如: 你也可以返回序列中的...

幕三少
2013/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部