LInq 与lambda表达式

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

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

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

先来点基础数据

  
    //用户类
public class User
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Address { get; set; }
[DataMember]
public string Phone { get; set; }
[DataMember]
public string Sex { get; set; } [DataMember]
public int Age { get; set; }
[DataMember]
public int SchID { get; set; }
}
 /// <summary>
/// 学校类
/// </summary>
internal class School {
public int SchID { get; set; }
public string SchName { get; set; }
public School(){}
public School(int id,string name)
{
SchID = id;
SchName = name;
}
}
/// <summary>
/// 公司类
/// </summary>
internal class Company {
public string Name { get; set; }
public List<User> Users { get; set; }
public Company() { }
public Company(string name, List<User> list)
{
Name = name;
Users = list;
}
}

接下来初始化点测试数据

   User user1 = new User()
{
ID = 111,
Name = "张一",
Address = "上海市某某区",
Phone = "13547878787",
Age = 30,
Sex = "男",
SchID=1
};
User user2 = new User()
{
ID = 112,
Name = "李小二",
Address = "上海市某某区",
Phone = "13547878783",
Age = 30,
Sex = "女",
SchID = 1
};
User user3 = new User()
{
ID = 113,
Name = "张三",
Address = "上海市某某区",
Phone = "13547878784",
Age = 30,
Sex = "男",
SchID = 1
};
User user4 = new User()
{
ID = 114,
Name = "李四",
Address = "上海市某某区",
Phone = "13547878785",
Age = 30,
Sex = "男",
SchID = 1
};
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


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

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



求最大最小值 Max Min

  //求最大值
var max = userlist.Max(a => a.ID);
Console.WriteLine(max);
//最小值
var min = userlist.Min(a => a.ID);
Console.WriteLine(min);

循环 ForEach

  //循环输出
userlist.ForEach(a =>
{
if (a.Age > 20)
{
Console.WriteLine(a.ID);
} });

条件筛选 where

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

排序

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

分组 ToLookup 和 GroupBy

 //分组
var lookup = userlist.ToLookup(a => a.Sex);
foreach (var item in lookup)
{
Console.WriteLine(item.Key);
foreach (var sub in item)
{
Console.WriteLine("\t\t"+sub.Name+" "+sub.Age);
}
}
//另一种
var dic = userlist.GroupBy(a => a.Sex);
foreach (var item in dic)
{
Console.WriteLine(item.Key);
foreach (var sub in item)
{
Console.WriteLine("\t\t" + sub.Name + " " + sub.Age);
}
}

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

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

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

类型查找 OfType

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

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

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

查找深层嵌套 SelectMany

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

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

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

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

 foreach (Company c in companylist)
{ foreach (var item in c.Users)
{
if (item.Sex == "女")
{
Console.WriteLine(item.Name + ":" + item.Sex);
}
}
}

 
标签: 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. codechef Little Elephant and Permutations题解

    The Little Elephant likes permutations. This time he has a permutation A[1], A[2], ..., A[N] of numb ...

  2. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  3. oracle 修改dbid和dbname

    一般这玩意没人修改,除非特殊情况,比如克隆数据库等等 步骤: 1.备份数据库 2.启动数据到mount状态 3.nid命令修改 (如果只是修改dbid,那么不需要dbname参数,需要更改dbname ...

  4. vim代码折叠命令简短

    作者:zhanhailiang 日期:2014-10-18 1. 通过fdm实现代码折叠:set fdm=xxx 有下面6种方式实现折叠: |fold-manual| manual Folds are ...

  5. IT行业为什么没有进度

    参加工作多年了,来来回回参与了N多项目,大部分都是政府性的招标项目.每个项目都是顺利进行验收,在这些验收过的项目中大部分都或多或少都有一定的时间延期,每个项目都能够和合同或者需求说明书对应的上,但是真 ...

  6. win10无法新建文件夹怎么办 win10右键新建菜单设置方法

    有朋友安装了win10系统后发现右键菜单中没有新建项,而平时使用新建 - 文件夹项的机率很高.如何才能恢复桌面右键菜单中的新建项呢? 右键点击桌面空白处,在右键菜单中发现没有新建项: 桌面右键菜单没有 ...

  7. Unreal Engine 4 创建Destructible Mesh(可破坏网格)

    Unreal Engine 4的物理引擎用的是PhysX. 支持网格破坏.布料.物理粒子等,非常强大.曾经须要编码才干完毕的工作,在Unreal Engine 4 中仅仅须要拖拖拽拽就完毕了,非常方便 ...

  8. 代码的未来读书笔记&lt;二&gt;

    代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端client以及静态动态这2个角度进行了对照. 这四种语言因为不同的设计方针,产生了不 ...

  9. nyoj 7 街区最短路径问题 【数学】

    找出横纵坐标的中位数,怎么找:先对x排序找x的中位数x0,再对y排序找y的中位数y0:最后统计各点到中位数点(x0, y0)的总距离: 街区最短路径问题 时间限制:3000 ms  |  内存限制:6 ...

  10. activity-alias使用

    activity-alias这是android为了重新使用Activity设计. 当Activity的onCreate()在方法,运行getIntent().getComponent().getCla ...