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;
}

我将非常感谢任何关于使它更简洁的反馈

感谢

奈杰尔

XDocument上低效的IEnumerable Select语句

你说得对;这可能是低效的。

你可以这样简化:

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())