2011-11-02 1 views
0

다음 코드가 있는데 문제가 없습니다. 그러나 나는 "IEnumerable 코드"를 사용하는 것에 익숙하지 않으며 더 잘 수행 될 수 있다는 것이 명백해 보입니다.XDocument에서 비효율적 인 IEnumerable Select 문

기본적으로 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; 
} 

내가 더 간결

감사

에게

나이젤 만들기에 대한 피드백을 매우 감사하게 될 것입니다

답변

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, 
       ... 
      }; 

.

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())로 다시 작성할 수 있습니다.