代表和Lambdas和LINQ,哦,我的!

时间:2009-01-13 16:01:56

标签: c# linq delegates lambda anonymous-methods

作为一个相当初级的开发人员,我遇到了一个问题,突出了我缺乏经验和我的知识漏洞。如果这里的序言太长,请原谅。

我发现自己处于一个涉及我需要学习一些新的(对我而来)技术的项目,包括LINQ(对象来说是OBJECTS和XML)。我在这一点上所读到的一切都表明,要利用LINQ,我需要完全理解以下内容(代理,匿名方法和Lambda表达式)。

好的,现在好玩了。我曾经使用过.NET事件模型,但是我已经消费了代表,但是大部分细节都是隐藏的(感谢Microsoft!)。我理解在基本层面上,委托实例是指向方法的指针(我知道这种过度简化)。

据我所知,匿名方法本质上是一种内联的未命名方法,通常(如果不是唯一的话)创建为委托的目标。

我也理解lambdas以不同的方式用于简化语法,可用于将简单的匿名方法指向委托。

请原谅我,如果我的任何描述都在这里,请理解这些主题。

所以,挑战:

  1. 如果我对这些项目的了解甚至更接近,至少在基础层面是否有人可以告诉我?我不是在寻找复杂的深奥细节,只是基础(现在)。

  2. 在项目中将LINQ应用到合理的效果之前,我需要在多大程度上真正理解这些概念?我想完全理解它,并愿意花时间。在我需要完成一些工作之前,我可能没有时间完全理解所有这些东西。

  3. 有人能指出一些很好的文章来解释这些主题并将它们应用到“真实世界”的例子中,这样我就可以了解主题的基础知识和应用它们吗?我的意思是现实世界,我是如何在“客户和发票”的背景下使用它而不是抽象的“矢量和形状”或“动物和奶牛”。出于演示目的,这种情况可能有点人为,但希望不是严格的学术性的。我在网上和书中找到了很多例子,但似乎很少有“简单英语”解释。

  4. 请您提前感谢您的耐心,时间和专业知识。

3 个答案:

答案 0 :(得分:6)

Where can i find a good in depth guide to C# 3?

1)到目前为止你的知识似乎没问题。 Lambda表达式将转换为匿名方法或System.Linq.Expressions.Expression,具体取决于上下文。由于您没有使用数据库技术,因此您不需要理解表达式(所有lambdas都是匿名方法)。您没有列出扩展方法,但这些方法非常重要(并且易于理解)。确保你看到如何将扩展方法应用于接口 - 因为linq中的所有功能都来自System.Linq.Enumerable - 一组针对IEnumerable(Of T)的扩展方法。

2)你不需要对lambdas有深刻的理解。

箭头语法(=>)对我来说是最大的障碍。箭头分隔了lambda表达式的签名和正文。

永远记住: Linq方法在枚举之前不会执行。

注意使用loop variables in a lambda。这是延迟执行的副作用,特别难以追踪。

3)当然,这里有一些我的答案显示linq方法调用 - 一些用xml。

答案 1 :(得分:5)

1)这些描述听起来非常准确。有时,匿名方法和lambda表达式需要创建一个新类型来放置委托的目标,因此它们可以充当closures

2/3)我会读到一些内容,直到你对委托,匿名方法和lambda表达式感到满意为止。我在C#2.0深度介绍了C#2.0和C#3.0中与代理相关的更改,但当然其他书籍也会详细介绍。我也有article,如果有帮助的话。

至于示例 - 委托用于许多不同的目的。它们是查看相同功能的不同方式,但它们可以感觉非常不同:

  • 提供在开始新主题时调用的代码
  • 对UI事件做出反应
  • 为LINQ查询提供过滤器,选择,排序等
  • 提供异步操作完成时的回调

如果您有任何具体情况,您可以更容易回答。

编辑:我应该指出,你现在只使用LINQ to Objects和LINQ to XML是个好消息,因为这意味着你还不需要理解表达式树。 (它们很酷,但是一步一步......)LINQ to XML实际上只是一个与LINQ很好地结合使用的XML API - 从我记忆中来看,你唯一能够使用LINQ to XML的委托就是你实际上正在调用LINQ to Objects。 (不可否认,这是非常好的 - 但这意味着你可以重复使用你已经学过的东西。)

由于您已经在深度中获得了C#,因此第10章和第11章提供了很多在LINQ中使用 lambda表达式(以及转换为lambda表达式的查询表达式)的示例。第5章有一些代表使用的不同例子。

答案 2 :(得分:1)

阅读本文......

http://linqinaction.net/

..所有你的问题都将得到解答!!!