Phi*_*l06 6 .net linq linq-to-xml
我没有得到这个Linq的东西.我可以编写复杂的SQL查询并编写了一些xpath.我正在尝试学习Linq to XML并且无法通过我的第一次尝试,尽管仔细研究了我可以谷歌的每一个简洁的例子.
给定XML:
<Manufacturer ManufacturerName="Acme">
<Model ModelName="RobotOne">
<CommandText CommandName="MoveForward">MVFW</CommandText>
<CommandText CommandName="MoveBack">MVBK</CommandText>
Run Code Online (Sandbox Code Playgroud)
查询输入是"Acme","RobotOne","MoveBack",我想输出"MVBK"
不确定这是否是构建XML的最佳方式我如何使用元素而不是属性来实现?有一些制造商和型号以及许多代码
如果你在整个LINQ to XML中遇到困难,我建议稍稍退一步看看linq.我相信linq非常值得付出努力,并会多次回报你 - 尤其是当我们迁移到众多世界时.
我建议你暂时忘记XML部分,只考虑linq正在做什么 - 在你得到linq的内容后,它将使XML的专用内容更容易理解.考虑到这两件事,我可以考虑一下linq:
我们的命令式语言人员很难放弃如何获得结果的细分(过度)规范.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);
Run Code Online (Sandbox Code Playgroud)
用于linq查询的C#中的模拟将是:
List<string> list = new List<string>();
foreach(string n in names)
{
if (n.length > 3) list.add(n);
}
Run Code Online (Sandbox Code Playgroud)
我认为在这个例子中很容易看出linq是如何与foreach做同样的事情(实际上它实际上非常接近这一点) - 但是你并没有像编译器那样的所有绒毛.在linq版本中有更少的粘性和更多的意图.另一种说法是linq正在为你做一些无聊的样板文件隐式允许你的代码只显示有趣的部分.
在功能上讲,where()方法是一个更高阶的函数.这只意味着它是一个自身接受或返回一个函数的函数.Where()采用lambda - 循环的有趣部分.lambda是C#中的一个匿名函数 - 所以Where()接受一个函数,因此它是更高阶的.我之所以提到这一点,是因为这个概念非常强大,也是理解linq的关键,并且可以深入了解linq实际上是一个全新的编程模型(函数式编程)如何用于C#.获得这个"更高阶的秩序"对于理解linq非常有帮助.
我认为,使用直接的List <T>查询(例如上面的查询)是了解linq如何工作的最佳方式.你发现自己对于L-2-O查询感到满意,然后再看看XML的东西 - 我想你会发现它们会更有意义.
随着.NET 4.0中的Reactive框架的推出,我们将看到linq不仅扩展到"拉"查询,还扩展到"推送"方案.即:该集合将在更改时触发代码.我相信函数式编程的概念(其中linq是C#的隧道)是我们处理并发和并行问题的最有可能的方法,因此学习它们非常重要 - 不仅仅是为了使我们的代码更简洁.
假设您正在使用此初始化:
string xml = @"
<Manufacturer ManufacturerName='Acme'>
<Model ModelName='RobotOne'>
<CommandText CommandName='MoveForward'>MVFW</CommandText>
<CommandText CommandName='MoveBack'>MVBK</CommandText>
</Model>
</Manufacturer>";
XElement topElement = XElement.Parse(xml);
Run Code Online (Sandbox Code Playgroud)
您可以通过以下 LINQ 查询获取结果:
string commandText = topElement.Elements("Model")
.Where(element => (string)element.Attribute("ModelName") == "RobotOne")
.Elements("CommandText")
.Where(element => (string)element.Attribute("CommandName") == "MoveBack")
.Select(element => element.Value)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
如果此 XML 进一步嵌套,您将需要更多 Select/Where 组合。