我有以下代码,它工作正常。但是我不熟悉使用“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;
}
我会非常感谢任何有关使其更简洁的反馈
由于
佰
答案 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())
。