2011-11-02 26 views
0

我有以下代碼,它工作正常。不過,我對使用「IEnumerable代碼」很陌生,似乎很明顯它可以做得更好。低效IEnumerable在XDocument上選擇語句

基本上我想要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; 
} 

我會很感激的任何反饋相對於使它更加簡潔

感謝

奈傑爾

回答

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

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

if (jobs.Count() > 0)可以改寫爲if (jobs.Any())