如果您在整个 LINQ to XML 方面遇到困难,我建议您稍微退后一步,大致了解一下 linq。我相信 linq 非常值得付出努力,并且会回报你很多倍——尤其是当我们迁移到多核世界时。
我建议您暂时忘记 XML 部分,只考虑 linq 在做什么——在您了解 linq 是什么之后,它将使 XML 的专门内容更容易理解。考虑到这两点有助于我考虑 linq:
-
它在实现接口 IEnumerable 的任何东西上表达标准的“运算符”(扩展方法)。换句话说,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);
C# 中用于 linq 查询的类比是:
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 非常有帮助。
我认为,使用上述的直接 List 查询是了解 linq 工作原理的最佳方式。在您发现自己对严格的 L-2-O 查询感到满意之后,再看看 XML 的东西——我想您会发现它们会更有意义。
随着 .NET 4.0 中即将推出的响应式框架,我们将看到 linq 不仅扩展到“拉”查询,还扩展到“推送”场景。即:集合将在更改时触发代码。我相信函数式编程的概念(其中 linq 是 C# 的通道)是我们处理并发和并行问题最有可能的基本方法,因此学习它们非常重要——不仅仅是为了让我们的代码更简洁。