Неэффективный оператор IEnumerable Select в XDocument

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