XDocument上低效的IEnumerable Select语句
本文关键字:IEnumerable Select 语句 XDocument | 更新日期: 2023-09-27 18:13:04
我有以下代码,它工作正常。然而,我是新的使用"IEnumerable代码",似乎很明显,它可以做得更好。
基本上,我希望所有的区域节点都在XML中,然后我想在Asp:repeater中输出的数据在XML中嵌套得相当深,但是4个字段都在同一级别。
var xDoc = xmlDoc.ToXDocument();
var jobs = xDoc.Descendants("Region")
.Select(x => new {
jobName = x.Element("Location").Element("Department").Element("Brand").Element("Jobs").Element("Job").Element("JobName").Value,
jobType = x.Element("Location").Element("Department").Element("Brand").Element("Jobs").Element("Job").Element("JobType").Value,
jobURL = x.Element("Location").Element("Department").Element("Brand").Element("Jobs").Element("Job").Element("URL").Value,
jobClose = x.Element("Location").Element("Department").Element("Brand").Element("Jobs").Element("Job").Element("JobCLDate").Value
}
);
if (jobs.Count() > 0)
{
careersListing.DataSource = jobs;
careersListing.DataBind();
careersListing.Visible = true;
}
我将非常感谢任何关于使它更简洁的反馈
感谢奈杰尔
你说得对;这可能是低效的。
你可以这样简化:
var jobs = from x in xDoc.Descendants("Region")
let job = x.Element("Location").Element("Department").Element("Brand").Element("Jobs").Element("Job")
select new {
jobName = job.Element("JobName").Value,
...
};
如果您喜欢使用方法调用语法,您可以传递一个声明临时变量的语句lambda表达式。
如果每个区域只有一个Job
元素(似乎是这种情况),为什么不直接查询它呢?
var jobs = xDoc.Descendants("Job")
.Select(x => new {
jobName = x.Element("JobName").Value,
jobType = x.Element("JobType").Value,
jobURL = x.Element("URL").Value,
jobClose = x.Element("JobCLDate").Value
}
);
另一个小优化:使用Any()
代替Count()
:
if (jobs.Any())
{
careersListing.DataSource = jobs;
careersListing.DataBind();
careersListing.Visible = true;
}
if (jobs.Count() > 0)
可以改写为if (jobs.Any())