#c#
#c#
Вопрос:
У меня есть следующий код, и он работает нормально. Однако я новичок в использовании «кода 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;
}
Я был бы очень признателен за любые отзывы относительно того, чтобы сделать его более кратким
Спасибо
Найджел
Ответ №1:
Вы правы; это может быть неэффективно.
Вы можете упростить его следующим образом:
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,
...
};
Если вы предпочитаете использовать синтаксис вызова метода, вы можете передать лямбда-выражение оператора, которое объявляет временную переменную.
Ответ №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;
}
Ответ №3:
if (jobs.Count() > 0)
может быть переписан как if (jobs.Any())
.