给定XML:
<Manufacturer ManufacturerName="Acme"> <Model ModelName="RobotOne"> <CommandText CommandName="MoveForward">MVFW</CommandText> <CommandText CommandName="MoveBack">MVBK</CommandText>
我建议你暂时忘记XML部分,只考虑linq正在做什么 – 在你得到linq的内容后,它将使XML的专用内容更容易理解.考虑到这两件事,我可以考虑一下linq:
>
它在实现接口IEnumerable< T>的任何东西上表达标准的“运算符”(扩展方法).换句话说,linq只是一个方法调用.一些方法接受代码(Func),一些(First())不接受.
>
这使您可以更少关注这些运算符如何为您提供结果的勇气,更多的是仅仅宣告您的意图.
我们的命令式语言人员很难放弃如何获得结果的细分(过度)规范. linq基本上给我们的是一种声明我们想要一个结果而不确切地说如何得到它的方法.这就是为什么,IMO,linq是如此重要的学习原因,因为它确实是“脱钩”的意图与确切的’如何’是linq真正酷的部分.基本上它将功能语言概念移植到可怜的旧命令C#中.
LINQ的一个有用的学习辅助工具是编写可以执行相同操作的C#命令式代码.这样做几次,突然你会看到linq为你做的模式.因此,例如,考虑一个’linq-to-object’声明.
string[] names= new string[] { "kevin","tristan",jen" }; var result = names.where(n => n.length() > 3);
用于linq查询的C#中的模拟将是:
List<string> list = new List<string>(); foreach(string n in names) { if (n.length > 3) list.add(n); }
我认为在这个例子中很容易看出linq是如何与foreach做同样的事情(实际上它实际上非常接近这一点) – 但是你并没有像编译器那样的所有绒毛.在linq版本中有更少的粘性和更多的意图.另一种说法是linq正在为你做一些无聊的样板文件隐式允许你的代码只显示有趣的部分.
在功能上讲,where()方法是一个更高阶的函数.这只意味着它是一个自身接受或返回一个函数的函数. Where()采用lambda – 循环的有趣部分. lambda是C#中的一个匿名函数 – 所以Where()接受一个函数,因此它是更高阶的.我之所以提到这一点,是因为这个概念非常强大,也是理解linq的关键,并且可以深入了解linq实际上是一个全新的编程模型(函数式编程)如何用于C#.获得这个“更高阶的秩序”对于理解linq非常有帮助.
使用直接列表< T>我认为,如上所述的查询是了解linq如何工作的最佳方式.你发现自己对于L-2-O查询感到满意,然后再看看XML的东西 – 我想你会发现它们会更有意义.
随着.NET 4.0中的Reactive框架的推出,我们将看到linq不仅扩展到“拉”查询,还扩展到“推送”方案.即:集合将在更改时触发代码.我相信函数式编程的概念(其中linq是C#的隧道)是我们处理并发和并行问题的最有可能的方法,因此学习它们非常重要 – 不仅仅是为了使我们的代码更简洁.