C# lambda 和 Linq
本章节给大家带来的是Lambda 和 Linq 的关系
Lambda : 是实例化委托的一个参数,也就是一个方法
Linq:是基于委托(lambda)的封装,代码重用,逻辑解耦,是一个帮助类库,linq是用泛型,委托,lamda实现的,总的来说:把对数据操作的通用部分完成,把可变的交给委托,使用者只关心可变部分。
一、Lambda
文章的开始已经说明Lambda是实例化委托的一个参数,也就是一个方法。那么我们通过代码来体现一下:
{
//.NetFramework 1.0-1.1的时候这样应用
NoReturnNoPara method = new NoReturnNoPara(DoNothing);
method.Invoke(); //.NetFramwork2.0 匿名方法出现,delegate关键字,可以访问局部变量
int i = ;
NoReturnWithPara method1 = new NoReturnWithPara(delegate (int id, int age)
{
Console.WriteLine(i);
Console.WriteLine($"{id} 今年{age}岁了!");
});
method1.Invoke(, ); //.NetFramwork3.0 把delegate关键字去掉,然后增加了一个箭头goes to
//lambda表达式:参数列表=>方法体
NoReturnWithPara method2 = new NoReturnWithPara((int id, int age) =>
{
Console.WriteLine(i);
Console.WriteLine($"{id} 今年{age}岁了!");
});
method2.Invoke(, ); NoReturnWithPara method3 = new NoReturnWithPara((id, age) =>
{ //省略参数类型,但是编译器可以根据委托推断出类型,是语法糖
Console.WriteLine(i);
Console.WriteLine($"{id} 今年{age}岁了!");
});
method3.Invoke(, ); //如果方法体只有一行,可以去掉大括号和分号
NoReturnWithPara method4 = new NoReturnWithPara((id, age) => Console.WriteLine($"{id} 今年{age}岁了!"));
method4.Invoke(, ); //如果方法体只有一行,可以去掉大括号和分号,还可以去掉new NoReturnWithPara,这个也是编译器语法糖
NoReturnWithPara method5 = (id, age) => Console.WriteLine($"{id} 今年{age}岁了!");
method4.Invoke(, ); //下面带有返回值的
Func<int> func0 = () => { return DateTime.Now.Month; };//有一个返回值
Func<int> func1 = () => DateTime.Now.Month; //如果方法体只有一行,去掉大括号分号和return }
使用反编译工具看会产生一个私有sealed类,然后会看到lambda表达式都会生成一个方法名字,然后都会在包括在Sealed类里面
二、Linq
很多人会把Linq和lambda混淆,面试的时候问lambda是什么,很多同学反问不就是Linq吗?
文章开头也讲述了Linq是基于委托(lambda)的封装,代码重用,逻辑解耦,是一个帮助类库,linq是用泛型,委托,lamda实现的,总的来说:把对数据操作的通用部分完成,把可变的交给委托,使用者只关心可变部分。接下来举个例子让大家可以更好的认识Linq和使用Linq
首先初始化一些基础数据:
private List<Student> GetStudentList()
{
#region 初始化数据
List<Student> studentList = new List<Student>()
{
new Student()
{
Id=,
Name="赵亮",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="再努力一点",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="王炸",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="疯子科学家",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="灭",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="黑骑士",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="故乡的风",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="晴天",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="旭光",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="oldkwok",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="乐儿",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="暴风轻语",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="一个人的孤单",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="小张",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="阿亮",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="37度",
ClassId=,
Age=
}
,
new Student()
{
Id=,
Name="关耳",
ClassId=,
Age=
}
,
new Student()
{
Id=,
Name="耳机侠",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="Wheat",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="Heaven",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="等待你的微笑",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="畅",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="混无痕",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="37度",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="新的世界",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="Rui",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="帆",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="肩膀",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="孤独的根号三",
ClassId=,
Age=
}
};
#endregion
return studentList;
}
只要实现了IEnumerable这个接口,都是可以使用 where,Count等方法,只要底层是实现IEnumerable的,都是linq to object
linq To object 是.netFramwork3.0的一个非常重大的改变
下面展示一下linq to object 的几种使用方式
#region linq to object Show
{
Console.WriteLine("********************");
var list = from s in studentList
where s.Age <
select s; foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.Name, item.Age);
}
} {
Console.WriteLine("********************");
var list = studentList.Where<Student>(s => s.Age < )
.Select(s => new
{
IdName = s.Id + s.Name,
ClassName = s.ClassId == ? "高级班" : "其他班"
});
foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName);
}
}
{
Console.WriteLine("********************");
var list = from s in studentList
where s.Age <
select new
{
IdName = s.Id + s.Name,
ClassName = s.ClassId == ? "高级班" : "其他班"
}; foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName);
}
}
{
Console.WriteLine("********************");
var list = studentList.Where<Student>(s => s.Age < )//条件过滤
.Select(s => new//投影
{
Id = s.Id,
ClassId = s.ClassId,
IdName = s.Id + s.Name,
ClassName = s.ClassId == ? "高级班" : "其他班"
})
.OrderBy(s => s.Id)//排序 .OrderByDescending(s => s.ClassId)//倒排
.Skip()//跳过几条
.Take()//获取几条
;
foreach (var item in list)
{
Console.WriteLine($"Name={item.ClassName} Age={item.IdName}");
}
}
{//group by
Console.WriteLine("********************");
var list = from s in studentList
where s.Age <
group s by s.ClassId into sg
select new
{
key = sg.Key,
maxAge = sg.Max(t => t.Age)
};
foreach (var item in list)
{
Console.WriteLine($"key={item.key} maxAge={item.maxAge}");
}
//group by new {s.ClassId,s.Age}
//group by new {A=s.ClassId>1}
}
{
Console.WriteLine("********************");
var list = studentList.GroupBy(s => s.ClassId).Select(sg => new
{
key = sg.Key,
maxAge = sg.Max(t => t.Age)
});
foreach (var item in list)
{
Console.WriteLine($"key={item.key} maxAge={item.maxAge}");
}
}
List<Class> classList = new List<Class>()
{
new Class()
{
Id=,
ClassName="初级班"
},
new Class()
{
Id=,
ClassName="高级班"
},
new Class()
{
Id=,
ClassName="微信小程序"
},
};
{
var list = from s in studentList
join c in classList on s.ClassId equals c.Id
select new
{
Name = s.Name,
CalssName = c.ClassName
};
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
}
{
var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
{
Name = s.Name,
CalssName = c.ClassName
});
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
}
{//左连接
var list = from s in studentList
join c in classList on s.ClassId equals c.Id
into scList
from sc in scList.DefaultIfEmpty()//
select new
{
Name = s.Name,
CalssName = sc == null ? "无班级" : sc.ClassName//c变sc,为空则用
};
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
Console.WriteLine(list.Count());
}
{
var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
{
Name = s.Name,
CalssName = c.ClassName
}).DefaultIfEmpty();//为空就没有了
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
Console.WriteLine(list.Count());
}
#endregion
linq to sql 运用的是表达式目录树,这个底层是实现的IQueryable,概念和linq to object是不一样的!
参考文章:https://www.cnblogs.com/loverwangshan/p/10182516.html
C# lambda 和 Linq的更多相关文章
- 第十二节:Lambda、linq、SQL的相爱相杀(1)
一. 谈情怀 Lambda.Linq.SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用. 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学 ...
- lambda,linq
一:什么是Lambda表达式 lambda表达式是实例化委托的一个参数,就是一个方法,具体实现如下: { //.NetFramework 1.0-1.1的时候这样应用 NoReturnNoPara m ...
- .Net进阶系列(4)-Lambda和linq入门(被替换)
一. Lambda和linq入门 lambda表达式又叫点标记,linq表达式又叫查询表达式,下面有三个简单的案例说明一下二者的基本用法,详细用法会在后续章节中更新. 二. 事例 1. 准备学生信息. ...
- Lambda与LINQ
Lambda与LINQ写法对比: 上为Lambda 下为LINQ 显示指定列 Students.select(u=>(new {Name=u.Sname,Address=u.Saddress}) ...
- Lambda(Linq)
在谈到lambda表达式之前,首先要说一下委托,在下一章会详细介绍委托,在这里就是简单说明一下. 委托的关键字段delegate,声明委托 public delegate void NoReturnN ...
- EF下lambda与linq查询&&扩展方法
1. linq查询数据 WebTestDBEntities db = new WebTestDBEntities(); 1.1 linq查询所有列数据 var userInfoList = from ...
- 第十三节:Lambda、linq、SQL的相爱相杀(2)
一. Linq开篇 1.Where用法 linq中where的用法与SQL中where的用法基本一致. #region 01-where用法 { //1. where用法 //1.1 查询账号为adm ...
- 第十四节:Lambda、linq、SQL的相爱相杀(3)
一. SQL 开篇 1. where用法 #region 封装EF调用SQL语句查询 public static List<T> ExecuteQuery<T>(string ...
- 扩展、委托、Lambda、linq
1.扩展 扩展是一个很有用的功能.如果你有一个类.不能修改,同时你又想给他加一个方法.这个过程就是扩展.扩展就是扩展方法. 例1: 类People public class People { publ ...
随机推荐
- Android深入四大组件(五)Android8.0 根Activity启动过程(后篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- 星空灯改装成USB供电
简单的手工活,20分钟搞定 1.用一根USB线剪断,将红黑两根线分别连接到星空灯电源供电的正负极 2.由于USB输出5V 0.5A的电流,因此需要改装下,办法一,加电阻,办法二,换灯泡,由于小电阻并不 ...
- N点虚拟主机管理系统如何使用?
有朋友问起N点虚拟主机管理系统怎么用呢?下面大概整理下他的使用方法,咱们来看看吧. 在讲如何使用N点虚拟主机管理系统之前,我们先来了解一下N点虚拟主机管理系统的介绍. N ...
- aspnetcore 认证相关类简要说明三
今天我们再来了解一个很重要的接口IAuthenticationService的实现类AuthenticationService: public class AuthenticationService ...
- python笔记7-多线程threading之函数式
前言 1.python环境3.62.threading模块系统自带 单线程 1.平常写的代码都是按顺序挨个执行的,就好比吃火锅和哼小曲这两个行为事件,定义成两个函数,执行的时候,是先吃火锅再哼小曲,这 ...
- Python学习---PyCharm的使用学习
1.1. IDEA的使用 PyCharm2017下载 链接:https://pan.baidu.com/s/1HPR9FtVV5BCvd3uTdOetxw 密码:ok0q 激活IDEA2017(方案一 ...
- Oracle与EntityFramework(EF)的一些事情
概要 Oracle 和EF 一起用的时候总会有各种问题,这里总结一下解决办法. 模式 Schema 用过Oracle的人应该知道,其实Oracle的用户名一般就是它的模式名称,如果你在用databas ...
- Linux提权后获取敏感信息的方法与途径
在本文开始之前,我想指出我不是专家.据我所知,在这个庞大的区域,没有一个“神奇”的答案.分享,共享(我的出发点).下面是一个混合的命令做同样的事情,在不同的地方,或只是一个不同的眼光来看待事物.我知道 ...
- Salesforce的多态存储和SAP C4C的元数据存储仓库
Salesforce Force.com integrates and optimizes several different data persistence technologies to del ...
- 理解活在Iphone中的那些App (一)
关于一个app的生命 干IOS开发两年多了,如果把大学中的时间也算上,编程也有六年了.这些时间中,从一个懵懵懂懂的学徒,变成一个还算熟练的码农,也多多少少有一点反思.于是,边促成了理解活在Iphone ...