LINQ学习(扩展方法,委托,Lambda表达式) 第一篇
前言:从今天开始我将我将学习LINQ的一些知识点,所以我将我整理的笔记发布,以供和我一样在学习LINQ的人能够参考。我们的目的就是学好LINQ的基础,然后再基础上面我们能够更进一步的学习到LINQ的精华。
- LINQ是什么?
(1) LINQ(Language Integrated Query)即语言集成查询。
(2) LINQ主要包含以下三个部分
1) LINQ to Objects主要负责对象的查询
2) LINQ to XML 主要负责XML的查询
3) LINQ to ADO.NET 主要负责数据库的查询
u LINQ to SQL
u LINQ to DataSet
u LINQ to Entrties
- LINQ的历史
(1) 最初由Anders hejlsberg构思,最初的研究计划称为“C w”。
(2)2007年11月19日,LINQ作为.NET FrameWork3.5的一部分正式发布。
- LINQ要解决的问题
注解:面向对象与数据访问两个领域长期分裂,各自为政。
(1) 编程语言中的数据类型与数据库中的数据类型形成两套体系。
(2) SQL编码体验落后
(3) SQL和XML都有各自的查询语言,而对象没有自己的查询语言。
例如:我们用LINQ实现查询数组中大于50的数字的代码是:
int[] arr = { 12, 33, 343, 456, 455, 6, 565, 565, 54 };
IEnumerable ie = arr.Select(p => p).Where(p => p > 50);
IEnumerator result = ie.GetEnumerator();
while (result.MoveNext())
{
MessageBox.Show(result.Current);
}
- LINQ的组成
- 扩展方法
(1) 目的:对已存在的类型的行为进行扩展。
(2) 目标:对现有的类提供额外的方法以增强该类的功能。
(3) public static class ClasssA
{
public static string ExtraMehtod(this string s){ …………. } //this后面
} 带类型,表明为该类型添加扩展方法:ExtraMehtod
(4) 注意事项:
1) 扩展方法是一种特殊的静态方法
2) 扩展方法必须在静态类中定义
3) 扩展方法的优先级低于同名的类方法
4) 扩展方法只在特定的命名空间内有效
5) 除非必须不要乱用扩展方法
6) LINQ中的方法绝大部分都是扩展方法
例如:建立一个WinForm程序如下图所示,用来演示所实现的一个转换字母大小写的扩展方法。:
在扩展方法这个事件下面的代码实现过程是:
(1) 先创建一个静态类,在创建了一个静态方法,并且这个静态方法实现了方法的重载,代码如下:
public static class ExtraClass
{
public static string ToPascal(this string s)
{
return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
}
public static string ToPascal(this string s, int len)
{
return s.Substring(0, 1).ToUpper() + s.Substring(len, 1).ToLower() + s.Substring(len+1);
}
}
(2) 双击扩展方法按钮触发的事件里面的代码为
private void btnExtraMethod_Click(object sender, EventArgs e)
{
string s = "abcdefg";
MessageBox.Show(s.ToPascal());
}
此程序的执行结果为:Abcdefg。
- Lambda表达式语法
(1) Lambda表达式是由.net framework l.0中有一个委托,在.net framework 2.0中有一个匿名方法过度而来。
(2) 最基本的Lambda表达式语法如下: (参数列表)=>{方法体}
说明:1) 参数列表中的参数类型可以是明确类型或者是推断类型
2) 如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来。
注:Lambda表达式与匿名方法相似,但不同,匿名方法中的参数必须是已定义的,而Lambda表达式可以是推断的。
例如:用Lambda表达式所实现上面那个列子的功能。如图:
(1) 先定义一个委托,如下所示:
public delegate string deleTransfer(string s); //注意方法签名
(2) 在定义一个方法实现转换的功能,代码如下:
public string ToPascal(string s)
{
return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
}
(3) 然后再单击Lambda控件事件下面的代码是:
private void btnLambda_Click(object sender, EventArgs e)
{
//.net framework 1.0委托-函数指针实现
//deleTransfer trans = new deleTransfer(ToPascal);
//MessageBox.Show(trans("abcdefg"));
//.net framework 2.0匿名方法实现
//deleTransfer trans = delegate(string s)
//{
// return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
//};
//MessageBox.Show(trans("abcdefg"));
//Lambda表达式实现
deleTransfer trans = s => s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
MessageBox.Show(trans("abcdefg"));
}
执行结果是:Abcdefg
上面我们已经完成了扩展方法,委托,LINQ的历史,Lambda表达式的基本知识都以介绍完毕,下面的博客我们将开始介绍LINQ的真正的操作数据的写法。
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构