我最近看到了臭名昭著的 Jon Skeet 关于使用 LINQ to XML 的帖子。这个特殊的代码片段引起了我的注意:
// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
customers.Select(c => new XElement("customer", //This line is "magic"
new XAttribute("name", c.Name),
new XAttribute("lastSeen", c.LastOrder)
new XElement("address",
new XAttribute("town", c.Town),
new XAttribute("firstline", c.Address1),
// etc
));
我决定在我的应用程序中自己测试它,在那里我设置了一个 foreach 循环,如下所示:
foreach (var kvp in m_jobs) { //m_jobs is a Dictionary<string,Job>
m_xmlDoc.Root.Element("SCHED_TABLE").Add(
kvp.Value.GenerateXmlNode())
);
}
我修改为:
m_xmlDoc.Root.Element("SCHED_TABLE").Add(
m_jobs.Select(job => job.Value.GenerateXmlNode())
};
其中 GenerateXmlNode() 是一种为特定作业项生成适当 XML 标记的方法。我不确定会发生什么,但你瞧,它的工作原理与我的 foreach 循环完全一样。我不太明白的是为什么?!另外,这被认为是 LINQ 的“滥用”还是“功能”?
为清楚起见进行编辑:我知道 .Select 将返回一个 IEnumerable ,其中包含我所要求的内容,但我没有明确列举它。我了解 .Add 的工作原理,因为它接受可变数量的参数,但同样,我没有明确枚举传递这些参数。那么......它仍然如何工作?