LInq 与lambda表达式

LinQ是我们常用的技术之一。因为我们绕不开的要对数据进行一系列的调整,如 排序、 条件筛选、求和、分组、多表联接 等等。

lambda则是我们常用的语法糖,配合linq使用天衣无缝,不知不觉就用上了,主要还是看着代码简洁,逼格够高。。。

接下来我们就来看看常用的有哪些

先来点基础数据

  1. //用户类
  2. public class User
  3. {
  4. [DataMember]
  5. public int ID { get; set; }
  6. [DataMember]
  7. public string Name { get; set; }
  8. [DataMember]
  9. public string Address { get; set; }
  10. [DataMember]
  11. public string Phone { get; set; }
  12. [DataMember]
  13. public string Sex { get; set; }
  14.  
  15. [DataMember]
  16. public int Age { get; set; }
  17. [DataMember]
  18. public int SchID { get; set; }
  19. }
  1. /// <summary>
  2. /// 学校类
  3. /// </summary>
  4. internal class School {
  5. public int SchID { get; set; }
  6. public string SchName { get; set; }
  7. public School(){}
  8. public School(int id,string name)
  9. {
  10. SchID = id;
  11. SchName = name;
  12. }
  13. }
  14. /// <summary>
  15. /// 公司类
  16. /// </summary>
  17. internal class Company {
  18. public string Name { get; set; }
  19. public List<User> Users { get; set; }
  20. public Company() { }
  21. public Company(string name, List<User> list)
  22. {
  23. Name = name;
  24. Users = list;
  25. }
  26. }
  1.  

接下来初始化点测试数据

  1. User user1 = new User()
  2. {
  3. ID = 111,
  4. Name = "张一",
  5. Address = "上海市某某区",
  6. Phone = "13547878787",
  7. Age = 30,
  8. Sex = "男",
  9. SchID=1
  10. };
  11. User user2 = new User()
  12. {
  13. ID = 112,
  14. Name = "李小二",
  15. Address = "上海市某某区",
  16. Phone = "13547878783",
  17. Age = 30,
  18. Sex = "女",
  19. SchID = 1
  20. };
  21. User user3 = new User()
  22. {
  23. ID = 113,
  24. Name = "张三",
  25. Address = "上海市某某区",
  26. Phone = "13547878784",
  27. Age = 30,
  28. Sex = "男",
  29. SchID = 1
  30. };
  31. User user4 = new User()
  32. {
  33. ID = 114,
  34. Name = "李四",
  35. Address = "上海市某某区",
  36. Phone = "13547878785",
  37. Age = 30,
  38. Sex = "男",
  39. SchID = 1
  40. };
  41. List<User> userlist = new List<User>(4) { user1, user2, user3, user4 };

List<School> Schlist = new List<School>() {
new School(1,"武汉大学"),new School(2,"华中科技大学"),new School(3,"华中师范大学")
};

统计(求和)Sum

  1.  
  1. //求和
  2. var sum = userlist.Where(a => { return a.ID > 0; }).Sum(a=>a.ID);
  3. Console.WriteLine(sum);
  1. //另一种写法
  2. sum =(from a in userlist where a.ID>0 select a.ID ).Sum();
  3. Console.WriteLine(sum);
  1.  

IEnumerable.Where()方法里面的参数数委托类型Func<TSource, bool> 前面为参数 最后面一个为返回值

  1.  
  1.  

求最大最小值 Max Min

  1. //求最大值
  2. var max = userlist.Max(a => a.ID);
  3. Console.WriteLine(max);
  4. //最小值
  5. var min = userlist.Min(a => a.ID);
  6. Console.WriteLine(min);

循环 ForEach

  1. //循环输出
  2. userlist.ForEach(a =>
  3. {
  4. if (a.Age > 20)
  5. {
  6. Console.WriteLine(a.ID);
  7. }
  8.  
  9. });

条件筛选 where

  1. //筛选
  2. var user = userlist.Where(a => a.ID == 114).Single();
  3. //筛选所有男性用户
  4. var templist = userlist.Where(a => a.Sex == "男").ToList();

排序

  1. //排序 根据ID逆序
  2. templist = userlist.OrderByDescending(a => a.ID).ToList();
  3. //升序
  4. templist = userlist.OrderBy(a => a.ID).ToList();

分组 ToLookup 和 GroupBy

  1. //分组
  2. var lookup = userlist.ToLookup(a => a.Sex);
  3. foreach (var item in lookup)
  4. {
  5. Console.WriteLine(item.Key);
  6. foreach (var sub in item)
  7. {
  8. Console.WriteLine("\t\t"+sub.Name+" "+sub.Age);
  9. }
  10. }
  11. //另一种
  12. var dic = userlist.GroupBy(a => a.Sex);
  13. foreach (var item in dic)
  14. {
  15. Console.WriteLine(item.Key);
  16. foreach (var sub in item)
  17. {
  18. Console.WriteLine("\t\t" + sub.Name + " " + sub.Age);
  19. }
  20. }

联接 (这里只展示内联接)Join

  1. //联接
  2. var temp = from usertemp in userlist join sch in Schlist on usertemp.SchID equals sch.SchID
  3. select new { Id = usertemp.ID, Name = usertemp.Name, Age = usertemp.Age,Schname=sch.SchName };

返回的匿名类,也可以指点实体类

类型查找 OfType

类型查找很少用到 因为我们都是用的泛型,不过这里还是列出来看看

  1. //类型查找
  2. List<object>objlist =new List<object>(){1,"2",false,"s",new User(){ID=1,Name="xx"}};
  3.  
  4. IEnumerable<string> query1 = objlist.OfType<string>();
  5.  
  6. foreach (string fruit in query1)
  7. {
  8. Console.WriteLine(fruit);
  9. }

可以看到把2个字符串类型给查找出来了

查找深层嵌套 SelectMany

selectMany很少人用也比较少人知道,它可以避免多层嵌套循环 其使用场景还是挺多的,见下代码

  1. //查找深层嵌套
  2. //初始化数据
  3.  
  4. Company ChinaMobile = new Company("中国移动",userlist);
  5. Company ChinaUnicom = new Company("中国联通", userlist);
  6. List<Company> companylist = new List<Company>() { ChinaMobile, ChinaUnicom };
  7. //找出2个公司所有女性成员
  8. var selectlist = companylist.SelectMany(a => a.Users).Where(b => b.Sex == "女");
  9. foreach (var item in selectlist)
  10. {
  11. Console.WriteLine(item.Name+":"+item.Sex);
  12. }

这里可以看到 给出的数据源都是同一个list集合 然后我们看每个集合中只有一个女性成员

正常情况下要想取得这数据的话 要经过2层嵌套循环

  1. foreach (Company c in companylist)
  2. {
  3.  
  4. foreach (var item in c.Users)
  5. {
  6. if (item.Sex == "女")
  7. {
  8. Console.WriteLine(item.Name + ":" + item.Sex);
  9. }
  10. }
  11. }

 
标签: Linq lambda

LInq 与lambda表达式的更多相关文章

  1. 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象

    本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...

  2. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  3. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  4. 动态LINQ(Lambda表达式)构建

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  5. LINQ使用Lambda表达式选择几列

    学习LINQ的Lambda的表达式,尝试从数据集合中,选择其中几列. 创建一个model: source code: namespace Insus.NET.Models { public class ...

  6. Linq之Lambda表达式

    一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...

  7. Linq之Lambda表达式初步认识

    目录 写在前面 匿名方法 一个例子 Lambda 定义 一个例子 总结 参考文章 写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说 ...

  8. 【2017-06-01】Linq基础+Lambda表达式实现对数据库的增删改查

    一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net.省去了自己敲代码的实体类和数据访问类的大量工作. 实体类: 添加一个Linq to sql 类 -- ...

  9. Linq基础+Lambda表达式对数据库的增删改及简单查询

    一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net,省去了自己敲代码的实体类和数据访问类的大量工作 实体类: 添加一个Linq to sql 类 --- ...

随机推荐

  1. ftp桥接到http服务

    先说一下我的需求:我的linodeserver近期ftp和sftp连不上了,port被封了.仅仅有http能够訪问,我没有办法上传文件了.由于我寻常都用beyond compare上传文件,非常方便. ...

  2. docker 中国站 www.dockerpool.com 报价图片下载

    为了方便一些基本的下载docker 镜像,我建立了一个docker该站 http://www.dockerpool.com 对于Docker用户提供一站式Docker镜像服务: 稳定可靠的官方镜像下载 ...

  3. PHP图像处理:3D图纸、缩放、回转、剪下、水印(三)

    来源:http://www.ido321.com/887.html 5.PHP对图像的旋转 1: <div> 2: <h4>旋转之前</h4> 3: <img ...

  4. 通常编译亲测56Y国际象棋源代码,精仿56Y国际象棋完整的源代码下载!

    今天公布亲测通常应编译56Y国际象棋源代码,精仿56Y牌源代码.喜欢的能够拿去研究.论坛资源太多.我们会把好的资源都公布出来,同一时候欢迎很多其它的程序猿增加我们! 增加我们的共同学习交流!     ...

  5. Outlook将收到邮件的附件保存在磁盘

    1. 新建一个宏 1)文件->选项->自定义功能区, 把主选项卡的 开发工具勾选上. 2)开发工具->宏,输入宏名,创建. 加入以下代码 Public Sub SaveAttach( ...

  6. Codeforces Round #264 (Div. 2) C Gargari and Bishops 【暴力】

    称号: 意甲冠军:给定一个矩阵,每格我们有一个数,然后把两个大象,我希望能够吃的对角线上的所有数字.我问两个最大的大象可以吃值. 分析:这种想法是暴力的主题,计算出每一格放象的话能得到多少钱,然后求出 ...

  7. Android 基于Netty接收和发送推送解决方案的消息字符串(三)

    在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> .我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...

  8. 【SICP读书笔记(四)】练习2.27 --- 表序列reverse的扩展:树结构的deep-reverse

    题目要求是,修改练习2.18所做的reverse过程,得到一个deep-reverse过程.它以一个表为参数,返回另一个表作为值,结果表中的元素反转过来,其中的子树也反转. 例如: (define x ...

  9. Linux - SVN下载项目

    SVN下载项目 本文地址:http://blog.csdn.net/caroline_wendy 使用SVN.在Git上下载项目. $ mkdir chunyu_trunk //创建目录 $ ls / ...

  10. Apple Watch 1.0 开发介绍 1.2 简介 配置Xcode工程

    WatchKit app需要一个现有的iOS app.在iOS app工程中,添加一个新的WatchKit app target,它包含了WatchKit app和WatchKit extension ...