c# Linq&Lambda
0.写这个文章主要记录下常用Lambda的用法,能力有限,文中有问题的地方希望各位大神指出来谢谢!因为平时写代码的时候没有特地去用lambda,全是用一些循环,少量会用到lambda,虽然也能实现要的功能,但是代码量及可读性就没那么好了。所以重新熟悉了一下lambda。对了,此篇文章大部分内容参考了shang神的文章,部分内容自己补充了一些。
一.常用方法及说明
1.1 先准备如下类及列表用于实操
- public class Person
- {
- public int PId { get; set; } //自增ID
- public string Name { get; set; }
- public int Age { get; set; }
- public int JobId { get; set; }
- }
Person
- public class Job
- {
- public int JobId { get; set; } //自增ID
- public string JobName { get; set; }
- public int WorkAge { get; set; }
- }
Job
- List<Person> pA = new List<Person>();
- pA.Add(new Person() { PId = , Name = "张三", Age = , JobId = });
- pA.Add(new Person() { PId = , Name = "小红", Age = , JobId = });
- pA.Add(new Person() { PId = , Name = "王武", Age = , JobId = });
- pA.Add(new Person() { PId = , Name = "小梅", Age = , JobId = });
- pA.Add(new Person() { PId = , Name = "小李", Age = , JobId = });
PersonList
- List<Job> jB = new List<Job>();
- jB.Add(new Job() { JobId = , JobName = "制造业", WorkAge = });
- jB.Add(new Job() { JobId = , JobName = "IT行业", WorkAge = });
- jB.Add(new Job() { JobId = , JobName = "建筑业", WorkAge = });
- jB.Add(new Job() { JobId = , JobName = "金融业", WorkAge = });
jBList
1.2 主要操作方法
1.2.1 Select(将序列中的每个元素投影到新表中)
即当你只是需要序列中每个元素某个或者某些字段时,可使用Select
- //返回Name字段列表
- var result = pA.Select(k => k.Name).ToList();
- //加上index,并且返回一个匿名函数
- var result0 = pA.Select((k,index) => new { index = index,person = k}).ToList();
result 返回了Name字段的列表
result0 返回了一个匿名类的对象列表,匿名类有两个字段:index(下标),person对象
1.2.2 Where(基于谓词筛选值序列)
即筛选序列中符合条件的元素并返回新列表
- //筛选出Age大于18的记录
- var result1 = pA.Where(k => k.Age > ).ToList();
- //r参数代表元素在集合中的索引
- var result112 = pA.Where((k,r) =>
- {
- if (r <= )
- return false;
- return k.Age > ;
- }
- ).ToList();
- //筛选出Age大于18并且JobId等于3的记录
- var result2 = pA.Where(k => k.Age > && k.JobId== ).ToList();
- //筛选出Age大于18或者JobId等于3的记录
- var result3 = pA.Where(k => k.Age > || k.JobId == ).ToList();
result1筛选出Age大于18的记录
result112筛选出Age大于18并且下标大于3的记录
result2筛选出Age大于18并且JobId等于3的记录
result3筛选出Age大于18或者JobId等于3的记录
1.2.3
Single(返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。)
SingleOrDefault(返回序列中的唯一元素;如果该序列为空,则返回默认值;如果该序列包含多个元素,此方法将引发异常。)
First(返回序列中的第一个元素。)
FirstOrDefault(返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值。)
Last(返回序列的最后一个元素。)
LastOrDefault(返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值。)
以上这六个方法用法类似,目的都是为返回一个元素。后缀有Default就是当序列没有满足条件的元素时,返回为空。
- //返回满足指定条件的元素,若为空或返回数量不止一个,则抛异常
- var result171 = pA.Single(r => r.JobId == );
- //返回满足指定条件的元素,若为空,则返回空;若返回数量不止一个,则抛异常
- var result172 = pA.SingleOrDefault(r => r.JobId == );
- //返回满足指定条件的对象列表中的第一个元素,若为空,则抛异常
- var result173 = pA.First(r => r.JobId == );
- //返回满足指定条件的对象列表中的第一个元素,若为空,则返回空
- var result174 = pA.FirstOrDefault(r => r.JobId == );
- //返回满足指定条件的对象列表中的最后一个元素,若为空,则抛异常
- var result175 = pA.Last(r => r.JobId == );
- //返回满足指定条件的对象列表中的最后一个元素,若为空,则返回空
- var result176 = pA.LastOrDefault(r => r.JobId == );
1.2.4
OrderBy(根据键按升序对序列的元素排序。)
OrderByDescending(根据键按降序对序列的元素排序。)
ThenBy(根据某个键按升序对序列中的元素执行后续排序。)
ThenByDescending(根据某个键按降序对序列中的元素执行后续排序。)
即对序列进行排序。
- //先筛选出Age大于10的记录,再根据Age列升序/正序输出
- var result6 = pA.Where(k => k.Age > )
- .OrderBy(k => k.Age).ToList();
- //先筛选出Age大于10的记录,再按Age倒序,再按JobId正序,再按名称倒序。
- var result8 = pA.Where(k => k.Age > ).OrderByDescending(k => k.Age)
- .ThenBy(k => k.JobId).ThenByDescending(k => k.Name).ToList();
result6 返回了按照Age字段升序排列的列表
result8 返回了先按照Age字段降序,再按照JobId升序,再按照Name字段降序的列表
1.2.5
GroupBy(根据指定的键选择器函数对序列中的元素进行分组。)
ToDictionary(根据指定的键选择器函数,从 System.Collections.Generic.IEnumerable`1 创建一个 System.Collections.Generic.Dictionary`2。)
GroupBy可以对序列进行分组,ToDictionary可以将序列转成字典。
- var result4 = pA.Where(k => k.Age > ).GroupBy(j => j.JobId).Select(l => l.Key).ToList();
- var result41 = pA.Where(k => k.Age > ).GroupBy(j => j.JobId);
- var result42 = result41.ToDictionary(r => r.Key);
- var result43 = result41.ToDictionary(r => r.Key,rr=>rr.Select(r=>r.Name));
- var result5 = pA.Where(k => k.Age > )
- .GroupBy(a => new Person { PId = a.PId, Name = a.Name, Age = a.Age, JobId = a.JobId })
- .Select(a => a.Key).ToList();
result4先筛选出Age大于10的元素,再根据JobId字段分组(分组的字段即为Key),再选择键(Key)返回
result41先筛选出Age大于10的元素,再根据JobId字段分组(分组的字段即为Key)
result42在result41的基础上将分组后内容转成字典,键选择了分组时的Key,值默认是分组时的element
result43在result41的基础上将分组后内容转成字典,键选择了分组时的Key,值选择了分组时的element中的Name字段
result5先筛选出Age大于10的元素,再根据Persson对象分组,再选择键(Key)返回(此处的key为Person对象)
1.2.6 Average,Sum,Min,Max(平均值/求和/最大值/最小值)
- //获取Age的平均值
- var result10 = pA.Average(k => k.Age);
- //获取Age的平均值
- var result101 = pA.Sum(k => k.Age);
- var result201 = pA.Min(r => r.Age);
- var result202 = pA.Max(r => r.Age);
1.2.7
All(确定序列中的所有元素是否满足条件。)
Any(确定序列是否包含任何元素。/确定序列是否包含满足条件的元素。)
- var result211 = pA.All(r => r.Age > );
- var result212 = pA.Any(r => r.Age > );
- var result213 = pA.Any();
result211中只有PA列表所有元素的Age大于18,才返回True
result212中PA列表任一元素的Age大于18,即返回True
result213中PA列表不为空时返回True
1.2.8 Repeat(生成包含一个重复值的序列。)
- var result191 = Enumerable.Repeat(pA.First(), );
result191 返回了有十条pA.First()元素的序列
1.2.9
Cast(将 System.Collections.IEnumerable 的元素强制转换为指定的类型。)
OfType(根据指定类型筛选 System.Collections.IEnumerable 的元素。)
- var result221 = pA.Cast<object>();
- var result222 = pA.OfType<Job>();
result221中将pA序列中所有元素强转成object类型(实际使用应该会转其他类型)
result222从pA序列中筛选出类型为Job的元素并返回
1.2.10
Take(从序列的开头返回指定数量的连续元素。)
TakeWhile(只要满足指定的条件,就会返回序列的元素。)
Skip(跳过序列中指定数量的元素,然后返回剩余的元素。)
SkipWhile(只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。)
- //先筛选出Age大于10的记录,再取前三条记录
- var result154 = pA.Where(o => o.Age > ).Take().ToList();
- //从index=0开始,若符合条件,则取出并继续下一个,否则。停止。(与Where不同)
- var result155 = pA.TakeWhile(k => k.Age > ).ToList();
- var result156 = pA.TakeWhile((k, index) => index < ).ToList();
- var result161 = pA.Skip();
- //从index=0开始,若符合条件,则跳过该继续下一个,否则。停止。
- var result162 = pA.SkipWhile(r => r.JobId == );
- var result163 = pA.SkipWhile((r,index) => index <= );
result154先筛选出Age大于10的记录,再取前三条记录
result155从pA序列的index=0开始,若元素符合条件(此处是Age大于18),则取出并继续下一个判断,否则,停止判断并返回之前取出符合条件的元素。(与Where不同)
result155从pA序列的index=0开始,若元素符合条件(此处是index小于2),则取出并继续下一个判断,否则,停止判断并返回之前取出符合条件的元素。(与Where不同)
result161 先跳过pA前两个元素,再返回剩下的序列
result162从pA序列的index=0开始,若元素符合条件(此处是JobId等于3),则跳过该元素并继续下个元素的判断。否则,停止判断并返回当前元素以及剩下元素的序列。
result162从pA序列的index=0开始,若元素符合条件(此处是index小于3),则跳过该元素并继续下个元素的判断。否则,停止判断并返回当前元素以及剩下元素的序列。
1.2.11 Join(基于匹配键对两个序列的元素进行关联。使用默认的相等比较器对键进行比较。)
- var result12 = pA.Join(jB, j => j.JobId, k => k.JobId, (j, k) => new { j.PId, j.Name, j.Age, k.JobName }).ToList();
pA和jB分别是两个需要进行连接的序列,关联的字段为pA的JobId和jB的JobId字段,返回一个匿名类对象,包含pA的PId,Name,Age和jB的JobName字段
1.2.12 SelectMany(将序列的每个元素投影到 System.Collections.Generic.IEnumerable`1 并将结果序列合并为一个序列。)
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector);
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
- //返回的是IEnumerabele<string>类型
- var result181 = pA.SelectMany(r => new List<string>()
- {
- r.Name,
- r.Age.ToString()
- });
- var result182 = pA.SelectMany((r,index) => new List<string>()
- {
- r.Name,
- r.Age.ToString(),
- index.ToString()
- });
- //返回结果为List<object>,其中r为Person类,rr为第一步返回的 List<string>
- var result183 = pA.SelectMany(r => new List<string>()
- {
- r.Name,
- r.Age.ToString()
- },(r,rr) => new List<object>
- {
- r.JobId,
- rr
- });
result181 返回的序列中将会把原始序列中每个元素的Name和Age字段单独形成一个元素并返回,即新序列的长度为原始序列长度的两倍。
result182 返回的序列中将会把原始序列中每个元素的index,Name和Age字段单独形成一个元素并返回,即新序列的长度为原始序列长度的三倍。
result183 方法中第一个参数与result181 相同,第二个参数将原始序列中的元素和第一个参数返回的序列中的元素作为新参数,返回新的序列。
二.总结Linq这个东西其实挺好用的,要是用的好可以大大优美代码且减少代码量。还有一些复杂的方法没有讲到,等下次再写。有什么不足的地方希望大神提出来我会改之。
测试代码地址如下:Linq_Lambada
c# Linq&Lambda的更多相关文章
- SQL,LINQ,Lambda语法对照图(转载)
如果你熟悉SQL语句,当使用LINQ时,会有似曾相识的感觉.但又略有不同.下面是SQL和LINQ,Lambda语法对照图 SQL LINQ Lambda SELECT * FROM HumanReso ...
- ASP.NET EF(LINQ/Lambda查询)
EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...
- [算法1-排序](.NET源码学习)& LINQ & Lambda
[算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...
- linq lambda let
1.linq let用法 var query = from x in db.Users let theage = x.age let sexstring = x.sex ? "男" ...
- SQL,Linq,Lambda之间的转换练习
1.查询Student表中的所有记录的Sname.Ssex和Class列. SQL:select sname,ssex,class from Students linq:from s in Stude ...
- linq lambda GroupBy 用法
Linq 中按照多个值进行分组(GroupBy) /// <summary>要查询的对象</summary> class Employee { public int ID ...
- LinQ—Lambda表达式
概述 本篇博客主要解说lambda表达式,在这里将它的来龙去脉,主要是从托付,匿名函数这些方面过度讲的,当然,在讲托付和匿名函数的时候,主要是从Lambda的角度出发讲的,可能它们还具有其他的一些作用 ...
- sql linq lambda 对比
. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,class from student Linq: from s in Students ...
- c# linq lambda 去重,排序,取最高纪录。
----------------------------------------------------.对基础类型排序 方法一: 调用sort方法,如果需要降序,进行反转: List<int& ...
随机推荐
- SolrCloud7.4(Jetty容器)+mysql oracle 部署与应用
SolrCloud7.4(Jetty容器)搭建 1.Zookeeper搭建 版本:zookeeper-3.4.10.tar.gz 1.把zookeeper安装包上传到服务器 2.zookeeper解压 ...
- 图像转化成TFrecords格式并回转
import os import tensorflow as tf from PIL import Image import numpy as np cat_image_path='D:/软件/pyc ...
- 前段学习的roadmap
引自http://www.cnblogs.com/IMxinu/p/9693041.html
- Codeforces Round #245 (Div. 1) B. Working out (dp)
题目:http://codeforces.com/problemset/problem/429/B 第一个人初始位置在(1,1),他必须走到(n,m)只能往下或者往右 第二个人初始位置在(n,1),他 ...
- Linux系统中安装Oracle数据库
安装前的准备 三个包:winx64_12201_database.zip(oracle数据库) window_7(安装在虚拟机中的window7纯净版系统) client.zip(oracle的监听器 ...
- 2017-9-24模拟赛T1 个人卫生综合征(school.*)
题目 每天 BBS 都要从家里经过城市中的一段路到学校刷五三.城市中一共有 n 个路口和 m 条双向道路,每条双向道路都连接着两个路口 a i .b i 且有一定的时间花费 v i .BBS家编号为 ...
- 2019-04-18-day035-守护线程与池
内容回顾 互斥锁 在同一个进程中连续锁两次以上会死锁 进程的数据共享 进程之间可以共享数据 提供共享数据的类是Manager 但是他提供的list\dict这些数据类型是数据不安全的 针对 += -= ...
- 360技术笔试编程题 - 无意间看到这么个东西,闲来无事用JS写了一下
题目描述 为考验各自的数学能力,小B和小A经常在一起玩各种数值游戏,这一次他们又有了一种新玩法.每人从指定的数值范围中各自选择一个整数,记小A选择的数值为a,小B选择的数值为b.他们用一个均匀分布的随 ...
- 如何快速判断一个key是否存在在亿级数据中(bloomFilters)
面试题 现在有一个非常庞大的数据(亿级),假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高效) 分析 采用bloomFilters进行实现(时间&空间尽可能的有效) ...
- Java的类型强制转换
不说基本类型,没什么意思. 小括号的类型转换,在引用上,表示我坚定的确信,该未知类型一定是我转的类型,或者是我转的类型的子类. 这个转换逻辑和基本类型是不一致的.它不会进行任何具体的操作,只是一种标识 ...