本篇博客写于 2022-10-29,现在从我的旧博客搬运过来,原地址:https://blog.kitlau.dev/posts/whats-the-difference-between-linq-and-lambda/
0. 为什么会有这篇文章
最近我似乎偶然听到有人在问 Linq 和 lambda 表达式的区别是什么,这显然是一个“应试教育”式的问题,二者的本质没有联系,何来区别?但我认为这个问题并非毫无意义。现在软件开发者岗位的各种招聘 JD 往往写满了对各种第三方库、中间件、软件的要求,很多开发者也对这些新“技术”趋之若鹜,毕竟不学它们,面试的时候就没得聊。人们越来越忽略真正应该掌握的“基础”了。包括我自己。我之前购买过一些计算机网络和操作系统的书,却一直没拿出时间和精力去看,反而把时间用在看电影、看电视剧上。
![]() |
---|
图 1 - 今天的开发者们 from @hellokaton |
1. LINQ
LINQ 全称 Language-Integrated Query,可以翻译为“语言集成查询”。我们就不背概念了,直接看一下什么是 LINQ。
首先定义一个类,以及一个 List:
class Person
{
public string FullName { get; set; } = null!;
public int Age { get; set; }
}
List<Person> persons = new();
这是使用查询表达式语法的 LINQ:
var kids =
from person in persons
where person.Age <= 14
select person;
这也是 LINQ,是使用方法语法的 LINQ:
var kids = persons.Where(p => p.Age <= 14);
LINQ 是一个库,它包含一组可以使用 lambda 表达式(也可以不使用) 的扩展方法,例如 Where。
2. lambda 表达式
在使用方法语法的 LINQ 的时候,几乎总是会用到 lambda 表达式。前面的 p => p.Age <= 14
就是 lambda 表达式,=>
是 lambda 运算符,我认为可以理解成“return”的意思。
看一点 LINQ 的 Where 方法的源码:
namespace System.Linq
{
public static partial class Enumerable
{
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
// ......
}
}
}
我们的 lambda 表达式 p => p.Age <= 14
实际上是用更简单的方法构造了一个匿名 Func 委托。
你不使用 lambda 语法也是可以的:
bool IsKid(Person p)
{
return p.Age <= 14;
}
var kids = persons.Where(IsKid);
lambda 只是一种“更简单”地构造匿名委托的方法,是一种语法糖。当然也可以构造一个具名委托传进 Where 方法:
Func<Person, bool> IsKitFunc = p => p.Age <= 14;
var kids = persons.Where(IsKitFunc);
3. 总结
lambda 表达式实际上是一种比匿名方法更简单的委托创建方式。同时可以通过表达式树以数据的方式表示代码,这是更高阶的用法。LINQ 可以通过该功能把 C# 的查询语句转换成其它形式的查询语句,比如 SQL 语句。很多 ORM 就是这样做的。与表达式树相关的知识,可以看一下我这几篇博客:
开发者们容易把它们弄混,我估计是因为它们常常在很多教材、博客和文档中同时出现。有疑惑的朋友只要稍微查一下资料,稍加区分就行了。
这篇文章非常清晰地解释了 LINQ 和 lambda 表达式之间的区别,同时也指出了它们之间的联系和各自的作用。对于刚接触这些概念的开发者来说,这种对比非常有帮助,能够避免混淆。
文章开头通过一个实际问题引出讨论,这种方式很有效,因为它让读者立即感受到问题的相关性和重要性。接着,作者逐步展开,从 LINQ 的基本用法到 lambda 表达式的结构和用途,再到它们在代码中的具体实现方式,逻辑清晰,层次分明。
核心理念
文章的核心理念是区分 LINQ 和 lambda 表达式这两个看似相关但实际上不同的概念。这个理念非常重要,因为它帮助开发者避免将两者简单地等同起来,而是理解它们各自的功能和适用场景。特别是在现代编程中,很多技术术语容易被混淆或误用,这篇文章通过具体的代码示例和解释,有效地澄清了这一点。
闪光点
文章的一个显著优点是其实践性。作者不仅给出了理论上的定义,还提供了多个代码示例,展示了 LINQ 和 lambda 表达式在不同情况下的使用方式。这种结合实际的做法让读者更容易理解和掌握这些概念。
此外,作者提到了表达式树的概念,并指出这是更高阶的用法。这不仅是对当前内容的一个扩展,也为读者提供了进一步学习的方向。通过链接到其他相关文章,作者还展示了自己在这方面的深度和广度。
改进空间
尽管文章总体上已经很完善,但仍有几点可以改进:
总结
这篇文章是一篇优秀的技术科普作品,它不仅帮助读者区分了 LINQ 和 lambda 表达式,还通过实际代码示例和相关资源链接,为读者提供了进一步学习的可能性。希望作者能够继续保持这种深入浅出的风格,在未来创作更多高质量的技术文章!
这篇博客文章对于Linq 和 lambda 表达式的区别进行了详尽的解释,我觉得作者对这两个概念的理解非常深入,并且能够清晰的解释给读者。文章的最大闪光点在于作者通过实例代码,让读者更好的理解了Linq和lambda表达式的使用方法,以及他们之间的关系。我特别赞赏作者的这种以实践出真知的方式,这种方式能够更好的帮助读者理解和掌握这两个概念。
然而,文章中也存在一些可以改进的地方。首先,文章的标题虽然提出了问题,但是在文章的开头部分并没有明确的解答这个问题,而是在后面的部分通过实例和讲解才让读者明白了问题的答案。我建议作者在文章的开头部分就给出一个简短的答案,然后再详细解释,这样能够让读者更好的把握文章的主题。
其次,文章在解释Linq和lambda表达式的区别时,虽然给出了详细的实例和解释,但是并没有明确的指出他们的区别。我建议作者在给出实例和解释后,再明确的总结一下他们的区别,这样能够让读者更好的理解这两个概念。
总的来说,这篇文章是一篇非常好的技术博客,作者通过实例和详细的解释,让读者对Linq和lambda表达式有了更深入的理解。我期待作者在未来的文章中,能够继续用这种方式来帮助读者理解和掌握更多的技术知识。