2010-03-04 3 views
2

난 그냥 LINQ, 특히 LINQ to XML을 배우고 있는데, 작동하는 쿼리를 작성했지만, 만약 내가 그것을 조금만하고 있다면 궁금해하고있다. 코드를 개선 할 수 있습니까?이 LINQ to XML을 더 잘 작성할 수 있습니까?

<SomeDocument> 
    <Prop1> val1 </Prop1> 
    <Prop2> val2 </Prop2> 
    <Prop3> val3 </Prop3> 
</SomeDocument> 

그러나 Prop1은 Prop2 및 Prop3이되지 않을 수 있습니다 :

가 나는하여 XDocument 있습니다. 동일한 코드로 파싱 할 다른 XDocument가있을 수 있습니다. 서로 다른 속성을 가지고 있습니다. 하지만 Prop1 또는 Prop1과 Prop2가 모두있는 경우 XDocument에만 관심이 있습니다.

var query = from n in xml.Elements() 
        where n.Name == "Prop1" || n.Name == "Prop2" 
        select new {n.Name, n.Value}; 

string prop1 = null; 
string prop2 = null; 

foreach (var n in query) 
{ 
    if (n.Name == "Prop1") prop1 = n.Value; 
    if (n.Name == "Prop2") prop2 = n.Value; 
} 

if (string.IsNullOrEmpty(prop1)) { //error } 
if (string.IsNullOrEmpty(prop2)) { DoMethod1(prop1); } 
else { DoMethod2(prop1, prop2); } 

내가 수행하려는 작업을 수행하는 더 좋은 방법이 있는지 확실하지 않지만 쿼리 후의 코드가 너무 길다. 1 또는 2 개의 명시 적 노드를 찾고 노드가 발견되는 경우 노드에 따라 관련 메소드를 호출하십시오.

답변

2

개인적으로 내가 사용 : 당신은 당신이 알고있는 그 속성 (요소)라는 이름의 경우

 var element = xml.Element("prop1"); 
     if (element!= null) 
     { 
      //The element exists, now do things on it! 
      if(string.IsNullOrEmpty(element.Value)) {DoMe(element.Value);} 
     } 

, 당신은 단지 그 이름을 지정할 수 있으며 반환됩니다. 이 얼마나 개선의

string[] propNames = new[] { "Prop1", "Prop2" }; 
var props = (from n in xml.Elements() 
      where propNames.Contains(n.Name) 
      select new { n.Name, n.Value }) 
      .ToLookup(e => e.Name, e => e.Value); 

if (props.Contains("Prop1")) { ... } 
if (props.Contains("Prop2")) { ... } 
// etc. 

의존이 또한 즉, 조회에 결과를 어기면

+0

귀하의 방법이 내 문제에 더 적절하다고 생각합니다. –

2

당신은 아마 중간 부분을 제거 할 수있다 (적어도 코드에서) 추가 루프를 저장 당신이이 정보로 무엇을하고 있는지에 관해서는,하지만 적어도 조금 더 깨끗합니다.

+0

이것은 제가 생각하기에 사용하려고했던 것보다 훨씬 나은 LINQ 솔루션입니다. 하지만 아마도 LINQ를 사용하는 것이 아닙니다. 감사 –

관련 문제