XDocument上的IEnumerable Select语句效率低下

时间:2011-11-02 21:45:08

标签: c#

我有以下代码,它工作正常。但是我不熟悉使用“IEnumerable代码”,看起来很明显它可以做得更好。

基本上我想要XML中的所有Region节点,然后我想要在我的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;
}

我会非常感谢任何有关使其更简洁的反馈

由于

3 个答案:

答案 0 :(得分:2)

你是对的;这可能效率低下。

您可以像这样简化:

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表达式。

答案 1 :(得分:2)

如果每个区域只有一个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;
}

答案 2 :(得分:0)

if (jobs.Count() > 0)可以重写为if (jobs.Any())